2014-04-14 2 views
1

는 왜 즉시 호출 방법은 thiswindow 객체를 반환하지이 즉시 호출 된 메서드가 윈도우 객체를 반환하는 이유는 무엇입니까?

var o = {}; 
o.foo = function() { 
    console.log(this); 
}(); //Window {…} 

하지만 나중에 실행될 때, 방법 (I는 두 경우 모두에서 예상 한 것처럼) 객체 o를 반환? END_LINK하면 관심있는 창 개체를 보는 이유

var o = {}; 
o.foo = function() { 
    console.log(this); 
} 
o.foo(); //Object {foo: function} 
+0

입니다));'. – RobG

+1

첫 번째 호출에서'this '가 무엇일까? 왜 그렇게 생각합니까/기대합니까? – user2864740

답변

5

이 "이"가 호출시에 정의됩니다. 변수 할당은 오른쪽에서 왼쪽으로 발생하므로 할당이 이루어지기 전에 함수가 호출되므로 "this"는 여전히 전역 윈도우 객체를 참조합니다.

+1

대부분 올바르지 만 IIFE를 실행하면 새로운 실행 컨텍스트가 만들어집니다. * this *가 호출에서 설정되지 않았으므로 새 실행 컨텍스트에서 * this *가 전역 객체로 설정되고 "여전히"전역 객체를 참조하지는 않습니다. – RobG

+0

이것은 RobG의 답을 의미합니다. 나는 할당이 올바른 연관성을 가지고 있는지 몰랐다. 유용한 [자바 스크립트 연산자 및 연관성] 테이블 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table). – alexafluor

1
var o = {}; 
o.foo = function() { 
    console.log(this); 
}(); // 

이 글로벌 맥락이다 , 즉. 그것을 얻으려면 o 개체를 bindo 개체로해야합니다. this은 현재 컨텍스트의 개체를 나타냅니다. this 값은 다른 컨텍스트에없는 경우 항상 window 오브젝트를 보유합니다.

o.foo = function() { 
    console.log(this); 
}.bind(o); // 

데모 : http://jsfiddle.net/X6cyr/1/

+2

컨텍스트가 아닙니다 (여기서 * this * 값은 함수 컨텍스트에서입니다). * this * 값은 호출에서 설정되지 않으므로 기본값은 전역 객체입니다. – RobG

+0

@RobG 그래서 잘못 설명 했습니까? –

+0

"컨텍스트"라는 용어는 종종 * this *와 함께 부적절하게 사용됩니다. * this * 키워드는 함수를 호출하는 방법 (또는 * bind * 사용)에 의해 설정되는 실행 컨텍스트의 매개 변수입니다. 이 값은 호출이 이루어진 실행 컨텍스트와 완전히 독립적입니다. – RobG

1

당신은 immmediately 호출 함수식 (인생)을 실행하는 경우 :

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

그렇게 전역으로 설정되어 정의되는 함수 입력에 있도록 의 값이, 호 설정되지 목적. 엄격 모드에서는 정의되지 않은 상태로 유지됩니다.

0

개체 정의 본문에 console.log(this)을 실행하면 기본적으로 개체가 브라우저에 존재하지 않으므로 Window 개체를 참조하게됩니다. `o.foo = (함수() {...} (: 그래서 당신은 개체의 당신의 해상력 후 기능을 실행해야합니다 , 여기 내 IIFEs 괄호로 묶 경우는 코드를보다 명확하게 DEMO http://jsfiddle.net/X6cyr/2/

관련 문제