停止在闭包中通过引用传递
Stop passing by reference in closures
我的代码如下所示:
var a = [];
for(var i = 0; i < 10; i++) {
a[i] = function() {
console.log(i);
}
}
不幸的是,似乎i
是通过引用传递的,因此a
中的所有函数都输出10。如何使每个函数输出[=11的值=] 有什么时候创建的? IE。 a[0]()
给出 0,a[1]()
给出 1,等等
EDIT:澄清一下,我不希望 a
存储值 0-9。我希望 a
存储 return 值 0-9 的函数。
var a = [];
for(var i = 0; i < 10; i++) {
a[i] = (function(j) {
return function () {
console.log(j);
}
})(i);
}
性能更好的版本 -
function makeFunction(i) {
return function () {
console.log(i);
}
}
var a = [];
for(var i = 0; i < 10; i++) {
a[i] = makeFunction(i);
}
您需要调用一个函数(以创建一个捕获您的值的闭包),其中 returns 一个函数(您想要结束的函数)。像这样:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = (function(value) {
return function() {
console.log(value);
}
})(i);
}
我的代码如下所示:
var a = [];
for(var i = 0; i < 10; i++) {
a[i] = function() {
console.log(i);
}
}
不幸的是,似乎i
是通过引用传递的,因此a
中的所有函数都输出10。如何使每个函数输出[=11的值=] 有什么时候创建的? IE。 a[0]()
给出 0,a[1]()
给出 1,等等
EDIT:澄清一下,我不希望 a
存储值 0-9。我希望 a
存储 return 值 0-9 的函数。
var a = [];
for(var i = 0; i < 10; i++) {
a[i] = (function(j) {
return function () {
console.log(j);
}
})(i);
}
性能更好的版本 -
function makeFunction(i) {
return function () {
console.log(i);
}
}
var a = [];
for(var i = 0; i < 10; i++) {
a[i] = makeFunction(i);
}
您需要调用一个函数(以创建一个捕获您的值的闭包),其中 returns 一个函数(您想要结束的函数)。像这样:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = (function(value) {
return function() {
console.log(value);
}
})(i);
}