Почему "this" в анонимной функции не определено при использовании strict?
Почему это в анонимной функции не определено при использовании javascript в строгом режиме? Я понимаю, почему это может иметь смысл, но я не мог найти никакого конкретного ответа.
Пример:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
Тест в скрипке: http://jsfiddle.net/Pyr5g/1/ Проверьте регистратор (firebug).
4 ответа
Это потому, что до 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 строго
"TypeError: this is undefined"
(что намного лучше)
Существует механизм, называемый "бокс", который оборачивает или изменяет this
перед входом в контекст вызываемой функции. В вашем случае значение this
должно быть undefined
потому что вы не вызываете функцию как метод объекта. Если не строгий режим, в этом случае это заменяется window
объект. В strict
режим всегда неизменен, поэтому undefined
Вот.
Вы можете найти больше информации на
https://developer.mozilla.org/en/JavaScript/Strict_mode
Согласно ответу "Это переполнение стека", вы можете использовать this
внутри анонимных функций, просто вызывая .call(this)
в конце этого.
(function () {
"use strict";
this.foo = "bar";
}).call(this);
Строгий режим не допускает привязки по умолчанию, поэтому попробуйте следующее:
**yourFunctionName.bind(this)**
Надеюсь, теперь все работает нормально.