2014-09-24 12 views
0

나는 최근에 "JavaScript : good parts"를 읽고 이해할 수없는 예제 중 하나를 인용하기 시작했습니다. 내가 that (var that = this)를 사용하면 내가 myObject의 필드, val를 참조하고JavaScript 함수 호출

var add = function(a,b) { 
    return a+b; 
}; 

var myObject = { 
    val: 0, 
    increment: function(inc) { 
     this.val += typeof inc == 'number' ? inc : 1; 
    } 
}; 

myObject.increment(12); 
myObject.increment(); 
// till this line, the val is equal to 13 

// function invocation 
myObject.double = function() { 
    var that = this; 

    // inner function #1 
    var helper = function() { 
     that.val = add(that.val, that.val); 
    }; 
    // inner function #2 
    var test = function(){ 
     this.val = add(this.val, this.val); 
    }; 

    helper(); // the val is equal to 26 
    // test(); // the val is equal to 13 
}; 

: 나는 원래 예에 test 기능을 추가했습니다. 또한 내 test 함수에서 이것을 사용할 때 같은 객체의 동일한 필드를 참조하고 있지만 대답이 다릅니다. 모든 설명은 인정 될 것이다.

답변

1

보십시오 : 자바 스크립트에서

var obj = { 
    val: 0 
}; 

obj.func = function() { 
    var that = this; 

    console.log(this); // this refers to obj 

    var test1 = function() { 
     console.log(this); 
    }; 

    test1(); // this refers to the global scope or window 

    var test2 = function() { 
     console.log(that); 
    } 

    test2(); // this or that refers to obj 
} 

obj.func(); 

, 키워드 this 꽤 까다로운 일이 될 수 있습니다. this 값은 함수 호출 방법에 따라 다릅니다. 첫 번째 console.log은 이 obj.func 인 것을 나타내며 obj을 나타냅니다. 다음 예제에서 키워드 thistest1의 범위 내에 있습니다. 더 중요한 것은 test1obj.func과 다르게 호출된다는 것입니다. test1은 왼쪽에 도트없이 (개체의 속성으로) 호출되므로 this 키워드는 실제로 전역 범위를 나타냅니다. 코드가 window.test1()과 같다고 생각할 수 있습니다. 마지막 예는 var that = this 행이 유용한 이유를 나타내며 컨텍스트는 obj으로 유지됩니다.

+0

예제 코드에 감사드립니다. – Yar

1

당신이

var test = function(){ 
    this.val = add(this.val, this.val); 
}; 

thisthis를 사용하면 실제로 test하지 myObject을 의미한다 따라서 this.val은 정의되지 this.val = add(this.val, this.val); 실제로 아무것도하지 않습니다. 이것이 val 값이 변경되지 않는 이유입니다. 브라우저 콘솔에서이 코드를 실행