解释为什么这个闭包在迭代时返回值
Explanation of why this closure returns the value at the time of the iteration
可能重复:
JavaScript闭包是如何工作的?
我知道人们对闭包的一个问题是,除非你这样做,否则它会返回给定变量的最后一个值:
function f() {
var a = [];
var i;
for (i = 0; i < 3; i++) {
a[i] = (function (x) {
return function () {
return x;
}
})(i);
}
return a;
}
}
我需要解释的事情有点太多了。
在JavaScript中,变量的作用域始终是function
(或全局对象(。所以,如果你做一些类似的事情
for (var i = 0; i < 3; i++) {
a[i] = function (x) {
return i;
};
}
仅涉及一个CCD_ 2。在for
循环结束后,无论调用a[i]
函数中的哪一个,i
的值都是2
。
为了解决这个问题,我们需要建立一个新的范围。通常这是通过调用匿名函数来完成的,比如:
a[i] = (function (x) { // (1)
return function () { // (2)
return x;
};
})(i);
现在,迭代时的i
被映射到每次迭代的全新x
,函数(1(确保它被"捕获",直到执行a[i]
(2(。
相关文章:
- DOM:如何根据迭代器值设置元素宽度并在mouseover上调用函数
- javascript中对数字数组的迭代返回字符串
- 为什么这个 JavaScript switch 语句(在 for 循环内)保留了上一次迭代的值
- 循环中的Node.js回调具有错误的迭代器值
- 如何在当前迭代中获得下一次迭代的值
- 上次迭代返回未定义
- 从数据绑定属性迭代键值对
- JavaScript 上次迭代设置所有迭代的值
- 使用不正确的迭代器值进行事件分配
- 如何获取每次迭代的值
- 如何使用 jquery 在 keyup 上迭代更改值
- javascript 2D数组迭代返回未定义的函数参数
- AngularJs:迭代键值对的奇怪结果
- 如何保存每次迭代的值并相应地填充html行
- 在angular中正确迭代键值对
- setTimeout总是打印上次迭代的值
- 避免重写每次迭代的值
- 迭代返回Generator的Generator
- 迭代键/值并显示它
- 在JavaScript中迭代对象值