js let一个问题

for(let i=0;i<el.length;++i)
{
    el[i].addEventListener(click,function()
    {
        console.log(i);
    });
}

一个问题为什么let可以无视i最后的值?而可以根据最初的i进行打印

阅读 1.9k
2 个回答

是因为 ES6 新增了块作用域的存在。

对于 let 来说,每次 for 循环内部都是一个新的块,下一次循环块里访问的是 i 就是自己这个块里的,跟上一次循环没关系。

用 ES6 之前的函数作用域来模拟块作用域的话,就类似于:

var i;
for(i = 0; i < el.length; ++i) {
    function func(tmp) {
        el[tmp].addEventListener('click', function() {
            console.log(tmp);
        });
    }
    
    func(i);
}

楼上说的很对,let的作用只在当前块级作用域中有用,在块级作用域中添加异步代码,原理就是使用了闭包.

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