Javascript 尝试在for循环中创建对象
我相信有一个非常简单的解决办法,但我不能完全相信。我尝试在for循环中创建和排列对象,如下所示:Javascript 尝试在for循环中创建对象,javascript,Javascript,我相信有一个非常简单的解决办法,但我不能完全相信。我尝试在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;
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;
}
});
}
for(变量i=0;i<100;i++){
foos[i]=新的Foo(i*10);
bars[i]=someObject.createBar({
x:0,,
y:0,
foobar=函数(){
foo[i].a=true;
}
});
}
当尝试运行这个“无法设置未定义的属性”时,foos和bar在代码前面都声明为globals
如果我将foos创建为foos[0]并通过条[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;
}
}) );
}
(变量i=0;i<100;i++)的
foos.push(新Foo(i*10));
bars.push(someObject.createBar({
x:0,,
y:0,
foobar=函数(){
foo[i].a=true;
}
}) );
}
执行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;
}
});
}
for(变量i=0;i<100;i++){
foos[i]=新的Foo(i*10);
bars[i]=someObject.createBar({
x:0,,
y:0,
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);
}
for(变量i=0;i<100;i++){
(职能(一){
foos[i]=新的Foo(i*10);
bars[i]=someObject.createBar({
x:0,,
y:0,
foobar:function(){
foos[i].a=true;
}
});
})(i) );
}
第一个解决方案更明确,第二个现在可能更常见。您需要“锚定”i
的值。要做到这一点
for(var i=0; i<100; i++) {
(function(i) {
// now do stuff with i
})(i);
}
对于(var i=0;i您不能将值“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);
}
for(var i=0;iIs)这仅仅是因为您试图设置foo[i].a而不是foos[i].a在foobar函数中?@dougajmcdonald很好地看到了。我们都立即想到了一个闭包问题,但它可能只是一个输入错误……您的语法无效。foobar=
不能与对象文字符号一起使用两个输入错误!-这是闭包问题它是foobar
处理程序中的一个范围问题。使用.push代码>在这里没有帮助。