2011-11-03 2 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-in와 각 속성의 이름을 v를 공급합니다
for(var v in x){ 
    //print out v.id and v.name 
} 

, v 될 것 '0', '1',

x[v]10에 액세스 할 수 있지만 순차적으로 for 루프를 사용하는 것이 좋습니다 (예 :

).
for (var i = 0; i < x.length; i++) { 
    alert(x[i].id); 
    alert(x[i].name); 
} 

왜 당신의 목적은 "반복 처리"는 객체와 같은 배열에 숫자 인덱스를 초과 for-in을 피하기 위해 많은 이유가있다, 자세한 내용은 다음 질문을 참조하십시오

1

그런 식으로 배열을 중재하면 안됩니다. 다음과 같은 경우

당신이 볼 수있는 등, 배열의 속성/모든 방법을 통해 반복 당신은 경고 vhttp://jsfiddle.net/Xk7yB/

당신은 루프에 대한 정기적를 사용하는 경우, 그것은 잘 작동 :

function a() 
{ 
    var x = b(); 

    for(var i=0; i<x.length; i++){ 
     alert(x[i].name); 
    } 
} 
당신이 jQuery를 사용하는 경우

http://jsfiddle.net/Xk7yB/1/

1

, 당신은 또한 사용할 수 있습니다

$.each(x,function(){ 
    alert(this.id); 
    alert(this.name); 
}); 

jQuery $.each()은 익숙한 foreach 메커니즘과 가장 유사합니다.

관련 문제