Почему «this» в анонимной функции не определено при использовании strict? - PullRequest
79 голосов
/ 22 марта 2012

Почему это в анонимной функции не определено при использовании javascript в строгом режиме?Я понимаю, почему это может иметь смысл, но я не смог найти никакого конкретного ответа.

Пример:

(function () {
    "use strict";

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

Тест на скрипке: http://jsfiddle.net/Pyr5g/1/ Проверьте регистратор(Firebug).

Ответы [ 3 ]

93 голосов
/ 22 марта 2012

Это потому, что до выпуска 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

"TypeError: this is undefined"

(что намного лучше)

15 голосов
/ 22 марта 2012

Существует механизм, называемый "бокс", который оборачивает или изменяет объект this перед входом в контекст вызываемой функции. В вашем случае значение this должно быть undefined, потому что вы не вызываете функцию как метод объекта. Если не строгий режим, в этом случае он заменяется объектом window. В режиме strict он всегда неизменен, поэтому здесь undefined.

Вы можете найти больше информации на
https://developer.mozilla.org/en/JavaScript/Strict_mode

6 голосов
/ 13 февраля 2015

Согласно Этот ответ переполнения стека , вы можете использовать this внутри анонимных функций, просто вызывая .call(this) в конце его.

(function () {
    "use strict";

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