2010-06-10 2 views
0

좋아요. 저는 자바 스크립트의 고급 기능을 배우고 있으며, 이제는이 기능을 사용하려고 노력하고 있습니다. 여기 배열 내부의 객체 - 한 범위에서만 작동하지만 다른 범위에서는 작동하지 않습니까?

내 코드입니다 :

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..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' 블록의 나머지 부분에'item' 대신'state [item]'을 사용해야합니다. 말할 필요도없이 이것은 실제로 어레이를 반복하는 기본 방법이 아닙니다. – BalusC

+0

@BalusC 좋은 지적입니다. – deceze

+0

@balus 그렇다면 "선호되는 방식"은 무엇입니까? C 스타일의'(;;)'문법 이외에 빠진 부분이 있습니까? – Earlz

0

alert(item.fieldrid); //prints undefined 

에서 당신은 내가 할거야, 내가 생각 배열 상태 [항목] 그래서 행 앞에, 앞에 추가

item = state[item]; 

액세스해야합니다.

관련 문제