2011-11-18 12 views
0

는 사람이 나에게 다음 사항을하시기 바랍니다 설명 할 수 있습니다.자바 스크립트와 jQuery를 루프 배열

사례 1 : 내가 예상대로 작동

function MyObj() { 

    this.myArray = new Array(); 

    for(var i = 0; i<5; i++){ 
     this.myArray.push(i); 
     console.log("add to array:" + i); 
    } 
} 

. this.myArray는 0, 1, 2, 3, 4를가집니다.

사례 2 :

function MyObj() { 

    this.myArray = new Array(); 

    $.each([0,1,2,3,4],function(i,v){ 
     this.myArray.push(i); 
     console.log("add to array:" + v); 
    }); 
} 

내가 가진은 "this.myArray가 정의되어 있지 않습니다."방화범에서 불평

감사합니다.

+1

. case 2의 "this"는 배열의 실제 숫자입니다.그것은 [0,1,2,3,4]를 참조하고 있습니다. var를 만들고 'this'를 사용하면 안됩니다. 그래서 당신은'function() { myArray.push (this);' – Matt

답변

4

두 번째 예에서 함수를 $.each으로 전달하면 $.each이 해당 함수를 호출 함을 의미합니다. 따라서 해당 함수 내에서 this$.each이 할당 한 값을 참조합니다.

보통은 $.each을 참조하지만 jQuery는 사용할 컨텍스트를 수동으로 지정할 수있는 .call을 사용하여 콜백을 호출합니다. $.each의 경우, this는 항상 반복의 현재 개체를 참조하도록 설정되어 있습니다.

는이 문제를 해결하는 방법이 있습니다, 당신은 예를 들어 이런 식으로 뭔가를 할 수 : 자바 스크립트에서

var context = this; 
$.each([0,1,2,3,4],function(i,v){ 
    context.myArray.push(i); 
    console.log("add to array:" + v); 
}); 
+0

과 같은 것을 할 수 있습니다. 고마워, 알았어. 사례 2에서 값을 myArray로 푸시 할 수있는 방법이 있습니까? – user200340

+0

좋아요. – user200340

0

this 현재 객체에 "바인딩"입니다. 첫 번째 예제에서는 두 번째 함수 인수 (0, 1 등의 의미)에서 myArray가 정의되지 않은 전역 범위입니다. thisthis explanation을 읽으십시오.

는 귀하의 경우에 당신은 할 수 있습니다 :

function MyObj() { 

    this.myArray = new Array(); 
    var that = this; 

    $.each([0,1,2,3,4], function(i,v){ 
     this.myArray.push(i); 
     console.log("add to array:" + v); 
    }); 
} 
0

this 대신 $.each() 루프의 현재 반복을 참조하는 MyObj() 기능에 대한 올바른 범위에 있지 않습니다. 대신 수행

.each 함수에서
function MyObj() { 

    var $this = this; 
    this.myArray = new Array(); 

    $.each([0,1,2,3,4],function(i,v){ 
     $this.myArray.push(i); 
     console.log("add to array:" + v); 
    }); 
    console.log(this.myArray); 
} 
MyObj(); 

http://jsfiddle.net/KmxJC/

0

, this 등이 검사 하의 소자 따라서 실제 0,1,2 ...을 지칭한다. 또한 this은 원본이 숫자 (귀하의 경우)이거나 문자열 또는 기타 항목 인 경우에도 항상 개체입니다.

더 많은 정보를 원하시면 http://api.jquery.com/jQuery.each/를 참조하십시오.

편집 : 나는 당신의 문제를 해결하기 위해, 당신은 단순히 .each 코드 내에서 accesible 될 변수 arr 만들 수 있다고 생각. 즉, .each가 전역 범위에 있지 않으면 그 중 일부는 확실하지 않습니다.

var arr = new Array(); 

$.each([0,1,2,3,4],function(i,v){ 
    arr.push(i); 
    console.log("add to array:" + v); 
}); 
0

실제로 jQuery 함수 .each로 작업하면 myObj obj가 아니라 array 요소를 의미합니다. 그러한 코드를 사용해야합니다. 때문에 범위의

function MyObj() { 

this.myArray = new Array(); 
var obj = this; 

$.each([0,1,2,3,4],function(i,v){ 
    obj.myArray.push(i); 
    console.log("add to array:" + v); 
}); 
}