Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 理解闭包_Javascript_Closures - Fatal编程技术网

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

我在阅读一篇高级JavaScript文本时遇到了这些代码,我认为作者试图演示闭包,但没有解释这些代码。我已经盯着这些代码集看了好几个小时,仍然不明白为什么它们会产生不同的输出

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
循环时,它都会创建一个新的函数闭包,该函数闭包分别为每个计时器回调“捕获”值if
i
,因此它将在
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);