[javascript] strict를 사용할 때 익명 함수에서 “this”가 정의되지 않은 이유는 무엇입니까?
엄격 모드에서 javascript를 사용할 때 익명 함수에서 이것이 정의되지 않은 이유는 무엇 입니까? 왜 이것이 의미가 있는지 이해하지만 구체적인 답을 찾을 수 없습니다.
예:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
바이올린에서 테스트
하십시오 : http://jsfiddle.net/Pyr5g/1/ 로거 (방화범)를 확인하십시오.
답변
ECMAscript 262 에디션 5까지는를 사용하는 사람들 constructor pattern
이 new
키워드 를 사용하는 것을 잊으면 큰 혼란이 있었기 때문 입니다. new
ES3에서 생성자 함수를 호출 할 때 사용하는 것을 잊은 경우 this
전역 개체 ( window
브라우저에서)를 참조하고 변수로 전역 개체를 제거합니다.
그 끔찍한 행동이었다 ECMA에서 사람들이 결정하므로, 단지 세트 this
로 undefined
.
예:
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);