数组内的对象 - 在一个范围内工作,但不在另一个范围内?
问题描述:
好吧,我一直在学习一些更高级的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:
虽然它可能是很有诱惑力的使用这样的一种方式来遍历数组,这是一个坏主意。
答
在
alert(item.fieldrid); //prints undefined
您需要访问阵列状态[项目],这样前行,前面加上
item = state[item];
我想,我做了。
实际上,你可以遍历它,'var item'只保存数组索引。你应该在'for'块的剩余部分使用'state [item]'而不是'item'。不用说,这确实不是循环访问数组的首选方式:) – BalusC 2010-06-10 01:22:30
@BalusC好点。 – deceze 2010-06-10 01:23:08
@balus那么什么是“首选方式”?除了C风格'for(;;)'语法之外,我还缺少一些捷径吗? – Earlz 2010-06-10 01:27:23