关于代码
for(let i = 0; i < btn.length; i ++){
console.log(i);
btn[i].addEventListener('click',function(){
console.log(i);
})
}
疑问1.为什么可以每次打印都打印循环中i的值而不是循环结束后i的值
理解:因为es6存在块作用域,而let声明变量是在当前作用域块的顶端,因为每一次循环都会生成一个作用域块,所以每一个i都是一个新的变量,该循环为每个button都定义了一个声明函数,在函数执行的时候,
我的理解是根据作用域链会找到最终包含i变量的执行环境为 比如btn[2]就会找到
{
let i = 2;
btn[2].addEventListener('click',function(){
console.log(i);
})
}
参考文档:
es6 let for循环
有一个疑问是既然循环每次都是声明不同的变量,为什么在 ++ 的过程中i的值会发生变化,文档中说__status会记录每一次i最后的值将该循环变为
{let i ;
i = 0;
__status = { i };
}
{let {i} = __status;
btn.addEventListener('click',function(){
console.log(i);
}
}
具体__status的原理不是特别清楚。
关于let或者es6更多的理解可以参考阮一峰老师ES6的链接个人感觉比较全有很多比较详细的知识。
记录学习过程中的疑问请大佬多多指教哈哈。