Javascript中的奇怪行为增强了…在循环中

Javascript中的奇怪行为增强了…在循环中,javascript,for-loop,foreach,Javascript,For Loop,Foreach,我正在用canvas标签制作一个Javascript游戏,我正在使用一个增强的for循环来更新玩家的位置 简言之: var actors = new Array(); var player = new Actor(0, 0, img); actors[0] = player; function update_positions() { //position 1 for(var a in actors) { //position2 a.xpos

我正在用canvas标签制作一个Javascript游戏,我正在使用一个增强的for循环来更新玩家的位置

简言之:

var actors = new Array();

var player = new Actor(0, 0, img);

actors[0] = player;

function update_positions() {
    //position 1
    for(var a in actors) {
        //position2
        a.xpos += a.xvel;
        a.ypos += a.yvel;
    }
}

就在位置1的for循环之外,我可以访问actors[0].xvel的正确值。在位置2处的for循环内部,a.xvel未定义。有人能给我解释一下发生了什么吗?

试着使用
actors[a].xpos
而不仅仅是
a.xpos


有关的详细信息,请参见此处。

您似乎试图访问名称上的对象属性,而不是此处的值。索引(在本例中为“0”)被分配给for/in循环中的“a”

您要做的是访问数组成员的值,即:actors[a]

试试这个:

for(var a in actors) { // a=0 the first time around the loop,  
    actor = actors[a]; // same thing as actors[0];
    actor.xpos += actor.xvel;
    actor.ypos += actor.yvel;
}
for(x in y)
构造遍历数组的索引,而不是其成员。

该语句用于遍历对象属性,通过查看您的代码,可以看出
actors
是一个数组(您正在使用index
0
设置初始元素)

如果您扩展了
数组,则此语句还将扩展原型链。原型将迭代这些属性,并且不保证迭代顺序

我建议您避免使用普通for循环进行迭代:

for (var i = 0; i < actors.length; i++) {
    actors[i].xpos += actor.xvel;
    actors[i].ypos += actor.yvel;
}

另一种选择是使用库:

或者,如果您不想使用下划线,但仍在使用JQuery,则可以执行以下操作:

$.each( actors, function(i, a) {
    a.xpos += a.xvel;
    a.ypos += a.yvel;
});
这种迭代函数模式的一个很好的特性是,您可以使用
var
在循环中声明作用于循环主体的变量,这有助于避免被JavaScript的奇怪变量作用域规则所困扰。

请参见此问题
_.each( actors, function(a) {
    a.xpos += a.xvel;
    a.ypos += a.yvel;
});
$.each( actors, function(i, a) {
    a.xpos += a.xvel;
    a.ypos += a.yvel;
});