Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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 尝试在for循环中创建对象_Javascript - Fatal编程技术网

Javascript 尝试在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循环中创建和排列对象,如下所示:

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在这里没有帮助。