老师,请帮解释一下下面的问题

老师,请帮解释一下下面的问题

<!DOCTYPE html>
<html>

<head>
    <title></title>
    <style>
    </style>
</head>

<body>
    <ul id="myul">
        <li>事件监听</li>
        <li>事件监听</li>
        <li>事件监听</li>
        <li>事件监听</li>
        <li>事件监听</li>
        <li>事件监听</li>
        <li>事件监听</li>
        <li>事件监听</li>
        <li>事件监听</li>
        <li>事件监听</li>
        <li>事件监听</li>
        <li>事件监听</li>
        <li>事件监听</li>

    </ul>

    <script>
        var oUl = document.getElementById('myul');
        var oLi  = oUl.getElementsByTagName('li')
        for(var i=0;i<oLi.length;i++){
            let a = oLi[i];
            oLi[i].onclick = function(){
                //this.style.color="red"  //教程的写法
                // oLi[i].style.color="red" 
                a.style.color="red"
            }
        }

       

    </script>
</body>

</html>

相关截图:

https://img1.sycdn.imooc.com//climg/64c73586098cac6209360719.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,涉及到作用域的问题。

使用let声明变量时,每循环一次,就会生成一个局部作用域;每个局部作用域中,都存在变量a:

https://img1.sycdn.imooc.com//climg/64c7475c09da38b107660248.jpg

这样,每个事件处理函数外层,都有一个局部作用域,并且里面有a,a存储对应的li:

https://img1.sycdn.imooc.com//climg/64c74c2909c1f1bf07670450.jpg

https://img1.sycdn.imooc.com//climg/64c7492709cd1b0407920442.jpg

当事件处理函数触发时,会沿着各自的作用域往外查找变量a:

https://img1.sycdn.imooc.com//climg/64c74a0c0975e64406000254.jpg

https://img1.sycdn.imooc.com//climg/64c74a5009b82ada06000254.jpg

此时的a,与事件触发者对应着,效果是对的。

当不声明变量a时,少了一层作用域。事件处理函数外面,是全局作用域:

https://img1.sycdn.imooc.com//climg/64c74a9c09e8a4b407040467.jpg

事件触发时,for循环已经结束了(代码执行很快,当我们点击li的时候,代码肯定执行完了,即for循环完事了)。此时全局变量i,已经是oLi.length了:

https://img1.sycdn.imooc.com//climg/64c74afe09f75c2d12850725.jpg

点击li,事件处理函数所用的i,会是全局变量i,而不是li对应的索引:

https://img1.sycdn.imooc.com//climg/64c74b620930922206490437.jpg

所以效果不对。

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师