[javascript] strict를 사용할 때 익명 함수에서 “this”가 정의되지 않은 이유는 무엇입니까?

엄격 모드에서 javascript를 사용할 때 익명 함수에서 이것이 정의되지 않은 이유는 무엇 입니까? 왜 이것이 의미가 있는지 이해하지만 구체적인 답을 찾을 수 없습니다.

예:

(function () {
    "use strict";

    this.foo = "bar"; // *this* is undefined, why?
}());

바이올린에서 테스트
하십시오 : http://jsfiddle.net/Pyr5g/1/ 로거 (방화범)를 확인하십시오.



답변

ECMAscript 262 에디션 5까지는를 사용하는 사람들 constructor patternnew키워드 를 사용하는 것을 잊으면 큰 혼란이 있었기 때문 입니다. newES3에서 생성자 함수를 호출 할 때 사용하는 것을 잊은 경우 this전역 개체 ( window브라우저에서)를 참조하고 변수로 전역 개체를 제거합니다.

그 끔찍한 행동이었다 ECMA에서 사람들이 결정하므로, 단지 세트 thisundefined.

예:

function myConstructor() {
    this.a = 'foo';
    this.b = 'bar';
}

myInstance     = new myConstructor(); // all cool, all fine. a and b were created in a new local object
myBadInstance  = myConstructor(); // oh my gosh, we just created a, and b on the window object

마지막 줄은 ES5 strict에서 오류를 발생시킵니다.

"TypeError: this is undefined"

(훨씬 더 나은 행동)


답변

this호출 된 함수의 컨텍스트에 들어가기 전에 개체 를 감싸거나 변경하는 “boxing”이라는 메커니즘이 있습니다 . 귀하의 경우에는,의 값은 this해야 undefined당신이 개체의 메서드로 함수를 호출하지 않기 때문에. 엄격하지 않은 모드 인 경우이 경우 window객체 로 대체됩니다 . strict모드 에서는 항상 변경되지 않으므로 undefined여기에 있습니다.

https://developer.mozilla.org/en/JavaScript/Strict_mode 에서 자세한 정보를 찾을 수 있습니다.


답변

This Stack Overflow answer 에 따르면 this단순히 .call(this)끝에서 호출 하여 익명 함수 내부에서 사용할 수 있습니다 .

(function () {
    "use strict";

    this.foo = "bar";
}).call(this);


답변