Почему "this" в анонимной функции undefined при использовании строгих?

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

Пример:

(function () {
    "use strict";

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

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

Ответ 1

Это потому, что до ECMAscript 262 edition 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"

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

Ответ 2

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

Более подробную информацию вы можете найти на сайте https://developer.mozilla.org/en/JavaScript/Strict_mode

Ответ 3

В соответствии с