2011-11-03 116 views
3

我相信这对于JS专家来说是一个简单的问题。不幸的是,我不是其中之一。返回数组的Javascript垃圾回收

我有以下情况。我正在函数b中创建一个数组,我使用一些新对象进行填充。然后我将该数组返回到函数a(称为函数b)。

当我遍历返回的数组时,内容都是未定义的。关闭袖口我认为JS垃圾收集器可能涉及这里。我将如何去解决这个问题?

真诚,

MJ

function a() 
{ 
    var x = b(); 

    for(var v in x){ 
     //print out v.id and v.name 
    } 
} 

function b() 
{ 
    var y = new Array(); 
    var m = new Object(); 
    var n = new Object(); 
    m.id = 1; 
    n.id = 2; 
    m.name = "alpha"; 
    n.name = "bravo"; 

    y.push(m); 
    y.push(n); 

    return y; 
} 

回答

12

的问题是你如何 “迭代” 通过你的阵列。您正在使用for-in语句,并且此语句应该用于枚举对象属性,而不是在数组或类似数组的对象上迭代

从代码:

for(var v in x){ 
    //print out v.id and v.name 
} 

在每次迭代的for-in声明养活v每个属性的名字,因为你是用你的榜样阵列,v'0''1',等等

你可以访问x[v],但我真的鼓励你使用顺序for循环,例如:

for (var i = 0; i < x.length; i++) { 
    alert(x[i].id); 
    alert(x[i].name); 
} 

有很多原因,以避免for-in,当你的目的是“迭代”在数字指标上阵列状物体,更多信息请参见下面的问题:

1

您不应该以这种方式对数组进行交互。你是通过所有的阵列的属性/方法循环等

,如果你能看到这一点,你警报vhttp://jsfiddle.net/Xk7yB/

如果使用普通的for循环,它工作正常:

function a() 
{ 
    var x = b(); 

    for(var i=0; i<x.length; i++){ 
     alert(x[i].name); 
    } 
} 

http://jsfiddle.net/Xk7yB/1/

1

如果你使用jQuery,你也可以使用:

$.each(x,function(){ 
    alert(this.id); 
    alert(this.name); 
}); 

jQuery $.each()与您习惯的foreach机制最为相似。