2011-11-03 108 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機制最爲相似。