关于块级作用域的问题

var box = document.querySelector('.box');
    for (var i = 0; i < 10; i++) {
        var li = document.createElement('li');
        li.innerHTML = i;
        box.appendChild(li);
        li.addEventListener('click',function(){
            console.log(i);
        })
    }

这段代码点击新生产的li标签全是10,高程书中说,闭包只能取得包含函数中任何变量的最后一个值,我理解了很长时间,不明白原委。
第二个问题是,为什么将i的类型设置为let就是点击显示正常,我知道let是块级作用域的概念,那为何块级作用域就能显示正常呢?
有些被绕里了,请大神解释一下,感激不尽了。

阅读 2k
2 个回答

1,这其实是块级作用域的问题,并没有涉及到闭包。
2,产生原因在于var与let使用的作用域不同。
var 变量的作用域是全局,而let 是局部的块作用域即for循环内,
全局变量唯一性,var 声明的变量i在循环中被不断覆盖最终只是唯一的10,因此在外部调用中无论li的哪一个,最终都是10。
而let是局部的作用域,并不会被覆盖。

第一个问题, var 不存在块级作用域, var 声明变量存在变量提升, 相当于在 for 循环外面定义了一个 i, 这里是存在闭包的

第二个问题, let 是 ES6 的知识, 提出了块级作用域, let 声明的变量具有块级特性, 比 var 声明的变量多了一个作用域

题主理解一下: 全局作用域, 函数作用域, 块级作用域, 在发散一下 - 活动对象, 作用域链 ==, 能有透彻的理解的, 嘿嘿

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题