for循环定义i之后,在执行语句中获得的i值问题

for循环定义i之后,在执行语句中获得的i值问题

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>Document</title>

</head>

<body>

    <ul>

        <li>HTML</li>

        <li>CSS</li>

        <li>JavaScript</li>

        <li>jquery</li>

        <li>HTML5</li>

        <li>CSS3</li>

        <li>ES6</li>

    </ul>

    <script type="text/javascript">

       var li=document.getElementsByTagName('li');

       for (let i=0;i<li.length;i++){

             let text=li[i].innerHTML;

           li[i].onmouseover=function(){

               li[i].style.fontSize="24px";

               li[i].style.color="red";

               li[i].innerHTML=text+"我是第"+(i+1)+"个";

           }

           li[i].onmouseout=function(){

            li[i].style.fontSize="16px";

            li[i].style.color="#000";

            li[i].innerHTML=text;

           }

       }

    </script>

</body>

</html>

虽然已经知道具体该怎么用,但是函数体具体获取i值得流程是什么?为什么用var的时候会一直输出最大值加1,用let就一次循环获取当前i值?目前只是强行记忆,没办法理解具体逻辑麻烦老师详细一些解答

正在回答 回答被采纳积分+1

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

1回答
好帮手慕星星 2019-04-07 17:34:07

你好,代码实现效果没有问题。

其实是作用域的问题,var和let的其中一个区别就是let声明的是局部变量,在当前代码块中作用,var声明的是全局变量。

1、使用var进行定义,给每个li绑定了相应的事件,当执行事件的时候就会先从当前作用域中找i,而当前作用域中没有,就会向上找,找到的是for循环中的i值,而for循环已经执行完毕,所以找到的就是for循环结束时的i值。

2、使用let进行定义,每循环一次,就会在当前作用域中保存当前的i值,当执行事件的时候,找到的就是局部作用域中的i值。

祝学习愉快!

  • 提问者 alluremyy #1
    for循环的小括号和花括号两部分作用域关系是什么?这两部分
    2019-04-07 18:34:22
  • 好帮手慕星星 回复 提问者 alluremyy #2
    这两部分作用域是一样的。
    2019-04-07 18:43:53
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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