let 和 var
// 循环中绑定事件,在事件内使用循环每次的计数器
var ali = document.querySelectorAll(".list li");
for(var i=0;i<ali.length;i++){
ali[i].onclick = function(){
console.log(i); //6
}
}
// 循环执行时没有变量去保存i的值,点击事件也没执行,var声明的变量在全局范围内有效
// i的值会随着循环的i++被一次次覆盖
// 拿不到所有的i,i会被覆盖直到循环结束此时i为6
// 相当于
// var i=0;全局的i 点击时循环已经结束 i是全局的每次i++后,i的值会改变
{
ali[i].onclick = function(){
console.log(i); //6
}
i++;
}
// 解决方法
// 方法一
// let触发了块级作用域,实现了作用域的嵌套
for(let i=0;i<ali.length;i++){
// let i=0;
ali[i].onclick = function(){
console.log(i);
}
}
// i是let声明的,当前的i只在本轮循环内有效本轮循环结束这个i就无效了再循环会重新声明,但是js内部会
// 暂时记录每轮循环这个i的值,在下一轮循环重新声明i时就是在