for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, i * 1000);
}
for (let i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, i * 1000);
}
let li=[1,2]
for(var i=0;i<3;i++) {
li.push(i);
((i,li)=> {
setTimeout(function() {
console.log(i,li);
}, (i + 1) * 1000);
})(i,li)
}
打印
2 2 2
0 1 2
1,[1,2,0,1,2] 2,[1,2,0,1,2] 3,[1,2,0,1,2]
var可以夸跨块访问,所以三个块的内容在延迟执行的方式下,都拿到了最后的值。
let是块级作用域,每个块都有自己的值,也拿不到其他块的值,所以都能拿到它当前的值。
针对var定义的变量,想要拿到当前的值,而不是最后的,就可以使用IIEF,函数会创建一个独立的作用域,会拿到定义它的时候的值;对于对象来说就是拿到那个引用地址,但引用地址始终没变,所以拿到的都是最终对象