数组内的对象 - 在一个范围内工作,但不在另一个范围内?

问题描述:

好吧,我一直在学习一些更高级的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,但相反,它产生未定义。

我在做什么错?

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

alert(item.fieldrid); //prints undefined 

您需要访问阵列状态[项目],这样前行,前面加上

item = state[item]; 

我想,我做了。