2010-06-10 101 views
0

好吧,我一直在學習一些更高級的Javascript方面,現在試圖使用這個我卡住了。數組內的對象 - 在一個範圍內工作,但不在另一個範圍內?

這裏是我的代碼:

function Data(){} 

function init(state){ 
    var item; 
    item=new Data(); 
    item.fieldrid=17; 
    item.description='foo'; 
    state.push(item); 
}; 


function findInState(state,fieldrid) { 
    for (var item in state) { 
     alert(item.fieldrid); //prints undefined 
     if (item.fieldrid == fieldrid) { 
      return item; 
     } 
    } 
    return null; 
} 

var s=[]; 
init(s); 
alert(s[0].fieldrid); //prints 17 (expected) 
alert(findInState(s,17).fieldrid); //exception here. function returns null. 

正在運行的例子是here at jsbin

爲什麼這個不行?我期望findInState中的警報產生17,但相反,它產生未定義。

我在做什麼錯?

回答

3
for (var item in state) 

您不應該使用for..in循環訪問數組。
它使用for (var i = 0; i < state.length; i++)時按預期工作。

https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/for...in

雖然它可能是很有誘惑力的使用這樣的一種方式來遍歷數組,這是一個壞主意。

+2

實際上,你可以遍歷它,'var item'只保存數組索引。你應該在'for'塊的剩餘部分使用'state [item]'而不是'item'。不用說,這確實不是循環訪問數組的首選方式:) – BalusC 2010-06-10 01:22:30

+0

@BalusC好點。 – deceze 2010-06-10 01:23:08

+0

@balus那麼什麼是「首選方式」?除了C風格'for(;;)'語法之外,我還缺少一些捷徑嗎? – Earlz 2010-06-10 01:27:23

0

alert(item.fieldrid); //prints undefined 

您需要訪問陣列狀態[項目],這樣前行,前面加上

item = state[item]; 

我想,我做了。

相關問題