const array = [1, 2, 3, 4];
for (var index = 0; index < array.length; index++) {
setTimeout(() => {
console.log("I am at index " + index);
});
}
当我在for循环中使用 "var "关键字时,我得到的输出为
I am at index 4
I am at index 4
I am at index 4
I am at index 4
但当我在for循环中使用 "let "关键字时。
const array = [1, 2, 3, 4];
for (let index = 0; index < array.length; index++) {
setTimeout(() => {
console.log("I am at index " + index);
});
}
I am at index 0
I am at index 1
I am at index 2
I am at index 3
谁能告诉我这里发生了什么?
你的问题的答案需要你理解
var
类型变量有一个 function/script
范围和由于 hoisting
它的声明将从 for 循环中向上移动,所以它将进入到 global scope
而每一次迭代,它都会发生变化,三个闭合都会共享一个变量 i
而如果我们从全局词法范围中替换掉 var
与 let
那么它将不会在for循环之外移动,成为一个 block-scoped
每一次迭代都是一个新的块,会有三个不同的词法作用域,用于三个超时回调和一个共享的全局作用域(我们的代码中没有任何东西)。