• for循环绑定事件时,var和let声明循环变量的区别


    在理解var、let、const三者在声明变量的区别时,遇到了一道十分有意思的题:

     1   <body>
     2         <ul>
     3             <li>第一个li</li>
     4             <li>第二个li</li>
     5             <li>第三个li</li>
     6             <li>第四个li</li>
     7             <li>第五个li</li>
     8         </ul>
     9     </body>
    10     <script> 
    11         var liList = document.querySelectorAll('li')  
    12         for(var i=0; i<liList.length; i++){
    13           liList[i].onclick = function(){
    14             console.log(i)
    15           }
    16         }    
    17     </script>

    以上代码中循环变量的声明用var和let会有什么不同的效果?
    用var时,都打印5。用let时,打印0、1、2、3、4。

    为什么会这样呢,以下对此做出解释:

    关键在于:1.理解作用域链。2.var和let的作用域。 3.变量提升。
    铺垫知识:
    1.var声明变量是函数作用域,而let声明变量是语句块作用域;
    2.var提升到函数定义顶部,此处是全局作用域顶部;let提升到语句块顶部,此处是for循环第一行。
    3.for( let i = 0; i< 5; i++) 这句话的圆括号之间,有一个隐藏的作用域(用var时没有)。
      for( let i = 0; i< 5; i++) { 循环体 } 在每次执行循环体之前,JS 引擎会把 i 在循环体的上下文中重新声明及初始化一次。

     正式讲解:
    1.i的声明被提升。
    2.当运行for循环时为i赋值,并为每个li绑定事件( 注意:运行for循环时只是绑定了事件但是并没有执行事件)。
    3.当触发事件时( 注意:此时for循环执行完了),现在需要控制台打印i的值,于是i便沿着作用域链寻找它的值。
    4.当用var声明时,i会在全局作用域中找到它的值,为5.
    5.当用let声明时,i会在for的第一行找到它的值,每次的值不一样,分别为0、1、2、3、4.

  • 相关阅读:
    DNS 主从同步配置
    Linux LVM卷组管理
    python ssh 执行shell命令
    python 批量远程机器,执行Linux命令
    连接管理 与 Netty 心跳机制
    java 注解 知识整理
    SOFARPC —— SPI 解析
    SOFARPC —— Generic Service (泛化调用) 解析
    线程池
    关于ava容器、队列,知识点总结
  • 原文地址:https://www.cnblogs.com/heisetianshi/p/13943128.html
Copyright © 2020-2023  润新知