Javascript 带有 let 变量的闭包
Javascript closures with let variable
为什么 javascript 闭包在这些示例中的工作方式不同?
for (let i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i)
}, 1000);
}
// Output: 0, 1, 2
let i = 0;
for (i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i)
}, 1000);
}
// Output: 3, 3, 3
在第一个代码示例中,您有 三个 个不同的 i
变量,并且在循环的每次迭代中,setTimeout
的回调函数关闭一个i
变量的不同 副本。
在第二个代码示例中,只有一个 i
变量并且在循环的每次迭代中,setTimeout
的回调函数关闭相同 i
可变。
第二个代码示例中只有一个i
变量,因为您在循环外声明了它;结果,循环的每次迭代都会看到 same 变量 i
.
为了在第二个代码示例中获得相同的输出,将其更改为如下所示:
let i = 0;
for (i = 0; i < 3; i++) {
let j = i; // save a copy of the current value of 'i'
setTimeout(() => {
console.log(j); // closure over a different 'j' variable in each iteration
}, 1000);
}
为什么 javascript 闭包在这些示例中的工作方式不同?
for (let i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i)
}, 1000);
}
// Output: 0, 1, 2
let i = 0;
for (i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i)
}, 1000);
}
// Output: 3, 3, 3
在第一个代码示例中,您有 三个 个不同的 i
变量,并且在循环的每次迭代中,setTimeout
的回调函数关闭一个i
变量的不同 副本。
在第二个代码示例中,只有一个 i
变量并且在循环的每次迭代中,setTimeout
的回调函数关闭相同 i
可变。
第二个代码示例中只有一个i
变量,因为您在循环外声明了它;结果,循环的每次迭代都会看到 same 变量 i
.
为了在第二个代码示例中获得相同的输出,将其更改为如下所示:
let i = 0;
for (i = 0; i < 3; i++) {
let j = i; // save a copy of the current value of 'i'
setTimeout(() => {
console.log(j); // closure over a different 'j' variable in each iteration
}, 1000);
}