Почему "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
В соответствии с