2014-11-11 2 views
3

'new'키워드가 자바 스크립트에서 작동하는 방식을 정리하려고합니다. 그러나 그것은 이상한 행동을합니다. 내가 노드에서이 코드를 실행하면
는 :Javascript 하위 함수의 새 키워드

var testing = function() { 
    self = this; 
    this.abc = 'abc'; 
    console.log(this); // ====> 1 

    var subMethod = function() { 
    console.log(this); // =====> 2 
    console.log(self === this); // ====> 3 
    }; 
    //subMethod.apply(this); 
    subMethod(); 
}; 


test = new testing(); 
// test = testing(); // ===> *4 

을 console.log (자기 ===이) 나 false를 제공합니다. nr 1의 'this'는 {abc : 'abc'}이며 하위 메소드의 'this'는 전역 'this'객체입니다. 아무도 나 에게이 행동에 대한 설명을 줄 수 있습니까?
subMethod.apply (this)로 실행하면 console.log (self === this)가 true ({abc : 'abc'})

새 키워드 (* 4)없이 실행하면 ' 이 변수는 예상대로 글로벌 'this'와 동일하며 console.log (self === this)도 true입니다.

왜 'this'가 'new'키워드로 실행될 때 글로벌 'this'와 같은 submethod에 있습니까?

+0

this.subMethod = function ....을 적용 할 때. 그렇다면이 범위는 예상대로입니다 {abc : 'abc', subMethod : [Function]} – Christian

+0

관련 : http://stackoverflow.com/questions/111102 * 명시 적으로 'new'에 대해 논의하지는 않지만 실제로는 없습니다. 특별한 점은 기대했던 것과 똑같습니다. 클로저는 까다로운 비트 다. – blgt

답변

1

new testing()을 호출하면 testing 함수의 컨텍스트 (this)가 새 개체로 실행됩니다. 첫 번째 로그는 해당 개체입니다. 내부에서 subMethod()을 실행하면 글로벌 컨텍스트로 실행됩니다. 그것이 바로 JS가하는 방법입니다. 따라서, thiswindow이고, self !== this이됩니다. this 컨텍스트 (subMethod.apply(this))로 전화하면 자연히 self === this이됩니다.

testing()으로 전화하면 글로벌 컨텍스트로 실행됩니다. abc을 추가하면 thiswindow이므로 현재는 글로벌입니다. subMethod()을 호출하면 기본적으로 글로벌 컨텍스트에서 호출되며 self === this과 같이 호출됩니다.

기본적으로 일반 기능을 실행하는 것은 글로벌 컨텍스트입니다. 함수를 생성자로 실행하면 (new) 새 컨텍스트가 만들어집니다. 메소드 실행 (예 : "abaca".split('a'))은 기본 객체의 컨텍스트에서 호출됩니다. 은 "abaca"과 함께 this으로 호출됩니다.

도움이 되었습니까?