Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.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 < 10; i++) { document.getElementById('box' + i).onclick = function() { alert('You clicked on box #' + i); }; } 但实际发生的是,无论你选择哪个部门,你都会收到关于上一次i-last事件的警报 我看到了内部函数问题的解决方案,但为什么会发生这种情况

可能重复:

我正在学习JavaScript中的闭包。。。我看到了简单代码的示例:

for (var i = 0; i < 10; i++) {
  document.getElementById('box' + i).onclick = function() {
    alert('You clicked on box #' + i);
  };
}
但实际发生的是,无论你选择哪个部门,你都会收到关于上一次i-last事件的警报


我看到了内部函数问题的解决方案,但为什么会发生这种情况?是否没有在每个iteretion上绑定onclick事件?

好的旧变量问题。您可以通过以i为参数的自调用函数轻松绕过它:

for(var i = 0; i < 10; i++) {
    (function(i) {
        document.getElementById('box' + i).onclick = function() {
            alert('You clicked on box #' + i);
        };
    })(i);
}

这之所以必要且有效,是因为我通常都是一样的——JavaScript只有一个函数作用域。通过使用以i为参数的自调用函数,每次都会创建一个新的i,然后保存在回调函数的闭包中。

每次迭代都会创建一个新函数,但每个函数都引用相同的变量i和内存中的一个位置。i的值仅在执行处理程序时计算。那一刻是for循环结束后很长一段时间,此时,我的值为10


值得一读,并提到了闭包的两种工作方式:绑定变量的当前值或引用变量本身。后者是JavaScript的情况。

搜索[JavaScript]回调循环的最后一个值。不缺少副本。-1因为,既然您知道闭包,就很容易找到副本。创建帖子时,尝试使用搜索功能或查看类似问题。最后一段在上下文中有点误导。例如,在Scala和C中,闭包也将引用绑定到变量。差异是一个[特定]变量的范围。嗯,我可能有点过于简单化了,但我认为这有助于理解差异,不是吗?我不是说这是错误的-答案仍然是我的赞成票。这只是给未来读者的一个提示。我很想看到否决这一点的人的评论。