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


86

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

예:

(function () {
    "use strict";

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

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


4
이것은 익명 함수와 관련이 없지만 호출 방법과 관련이 있습니다. 이 수정 된 바이올린을 참조하십시오 (콘솔 로그를보십시오).
Phrogz

@Phrogz : 이것은 혼란의 원인 일 수 있습니다. 지적 해 주셔서 감사합니다.
T. Junghans 2012 년

답변:


102

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"

(훨씬 더 나은 행동)


4
이것은 의미가 있습니다. 진술을 뒷받침 할 참조가 있습니까?
Rob W

1
@RobW : 내 자신을 검색해야했지만 Douglas Crockford가 여러 번 말한 것을 들었습니다. 이것이 그 결정의 이유입니다.
jAndy 2012 년

1
JavaScript : The Good Parts by Crockford에 언급되어 있습니다. 자세히 설명합니다. 하지만 ECMA의 결정에 관한 것은 아닙니다.
madr

1
이것이 엄격 모드가 기본적으로 정의되지 않은 이유에 대한 논리적 이유입니다. 또 다른 논리적 이유는 효율성이고, 또 다른 논리적 이유 this === window는 혼란스럽고 전역 범위를 토큰으로 함수에 유출하기 때문입니다
Raynos

2
@jAndy : 답변 주셔서 감사합니다. 이것은 의미가 있습니다. 나는 또한에 대한 변경의 컴팩트 설명 발견 javascriptweblog.wordpress.com/2011/05/03/...을 "첫 번째 인수는 전화 또는 적용 할 경우 대부분의 특히, null 또는 호출 된 함수의 정의되지는이 값 전역 개체로 변환되지 않습니다. "
T. Junghans 2012 년

15

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

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


@samuel 그러면 엄격 모드에서 어떻게 창 개체에 변수를 할당 할 수 있습니까 ??
Null 포인터

8

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

(function () {
    "use strict";

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

4
참고 thisWindow소망되지 않을 수있다이 경우에 객체
Ninjakannon

이 답변은 질문을 설명하지 않습니다.
Anvesh Checka
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.