我确信这有一个非常简单的解决方案,但我无法绕过它。我正在尝试在for循环中创建对象数组,如下所示:
for(var i = 0; i < 100; i++) {
foos[i] = new Foo(i*10);
bars[i] = someObject.createBar({
x : 0,
y : 0,
foobar = function() {
foo[i].a = true;
}
});
}
当试图运行它时,我得到'无法设置未定义的属性',foos和bars都在代码中作为全局变量声明。
如果我将foos创建为foos [0]并通过bars [0]访问它,它可以正常工作。我怀疑它与函数级别范围有关,但据我所知,数组应该可以在全局对象上访问....
答案 0 :(得分:3)
您需要“锚定”i
的值。要做到这一点......
for(var i=0; i<100; i++) {
(function(i) {
// now do stuff with i
})(i);
}
答案 1 :(得分:0)
试试这个:
for(var i = 0; i < 100; i++) {
foos.push( new Foo(i*10) );
bars.push( someObject.createBar({
x : 0,
y : 0,
foobar = function() {
foo[i].a = true;
}
}) );
}
答案 2 :(得分:0)
执行foobar时i的值是循环结束时的值(100)。因为循环块是一个闭包。
您最好存储所需的值。例如:
for(var i = 0; i < 100; i++) {
foos[i] = new Foo(i*10);
bars[i] = someObject.createBar({
x : 0,
y : 0,
i : i,
foobar: function() {
foos[i].a = true;
}
});
}
或者在循环中使用中间闭包来包含i:
for(var i = 0; i < 100; i++) {
(function(i){
foos[i] = new Foo(i*10);
bars[i] = someObject.createBar({
x : 0,
y : 0,
foobar: function() {
foos[i].a = true;
}
});
})(i);
}
第一个解决方案更明确,第二个解决方案可能现在更常见。
答案 3 :(得分:0)
您不能设置未定义的值“a”,因为“foo [i]”未定义。你从未定义过foo [i]。你的意思是foos [i],也许?
另外,正如其他人所说,你的函数foobar将为你创建的每个对象使用相同的i值。你应该用i创建一个新的闭包,它允许你定义一个局部变量i,它对于每个内部函数可以是不同的,如下所示:
for(var i=0; i<100; i++) {
(function(i) {
// now do stuff with i
})(i);
}