Javascript 理解闭包
我在阅读一篇高级JavaScript文本时遇到了这些代码,我认为作者试图演示闭包,但没有解释这些代码。我已经盯着这些代码集看了好几个小时,仍然不明白为什么它们会产生不同的输出Javascript 理解闭包,javascript,closures,Javascript,Closures,我在阅读一篇高级JavaScript文本时遇到了这些代码,我认为作者试图演示闭包,但没有解释这些代码。我已经盯着这些代码集看了好几个小时,仍然不明白为什么它们会产生不同的输出 for (var i = 0; i <= 2000; i += 1000) { setTimeout(function () { console.log('i value in closure is ' + i); }, i); } //Output // i value in closu
for (var i = 0; i <= 2000; i += 1000) {
setTimeout(function () {
console.log('i value in closure is ' + i);
}, i);
}
//Output
// i value in closure is 2000
// i value in closure is 2000
// i value in closure is 2000`
for(var i=0;i在第一个代码块中,for
循环将运行到完成。循环中的每一次都将安排一个setTimeout()
调用在将来的一段时间。但是,当
实际触发时,i
的值将是所有setTimeout()
调用的for
循环末尾的值
在第二个代码块中,for
循环将再次运行到完成,但每次通过for
循环时,它都会创建一个新的函数闭包,该函数闭包分别为每个计时器回调“捕获”值ifi
,因此它将在setTimeout()内显示所需的i
回调,因为它已为每个计时器单独保存
您可以将您的第二个代码想象得更像这样:
function myTimer(index) {
setTimeout(function () {
console.log('i value in closure is ' + index);
}, index);
}
for (var i = 0; i <= 2000; i += 1000) {
myTimer(i);
}
被称为立即调用的函数表达式(缩写为IIFE),是在Javascript中创建闭包的快速方法
有关此主题的更多信息,请参阅前面的回答:这是关于私有iBoth
for循环的所有内容
将运行到完成。
function myTimer(index) {
setTimeout(function () {
console.log('i value in closure is ' + index);
}, index);
}
for (var i = 0; i <= 2000; i += 1000) {
myTimer(i);
}
(function (i) {
some async operation here that uses i
})(i);