Почему "это" в анонимной функции не определено при использовании строгой?
почему этой в анонимной функции неопределенной при использовании javascript в строгом режиме? Я понимаю, почему это может иметь смысл, но я не смог найти конкретного ответа.
пример:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
тест в скрипке:http://jsfiddle.net/Pyr5g/1/ Проверить регистратор (поджигатель).
3 ответа:
это потому, что до ECMAscript 262 edition 5, была большая путаница, если люди, которые где используют
constructor pattern
забыл использоватьnew
ключевое слово. Если вы забыли использоватьnew
при вызове функции-конструктора в ES3,this
ссылается на глобальный объект (window
в браузере), и вы бы забили глобальный объект переменными.это было ужасное поведение, и поэтому люди в ECMA решили, просто установить
this
toundefined
.пример:
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"
(что является гораздо лучшим поведением)
существует механизм под названием "бокс", который обертывает или изменяет
this
объект перед входом в контексте вызываемой функции. В вашем случае, значениеthis
должно бытьundefined
потому что вы не вызываете функцию как метод объекта. Если режим не строгий, то в этом случае он заменяется наwindow
"объект". Вstrict
режим он всегда неизменен, вот почему этоundefined
здесь.вы можете найти более подробную информацию at
https://developer.mozilla.org/en/JavaScript/Strict_mode
По данным этот ответ переполнения стека, вы можете использовать
this
внутри анонимных функций, просто позвонив.call(this)
в конце его.(function () { "use strict"; this.foo = "bar"; }).call(this);