Почему "это" в анонимной функции не определено при использовании строгой?
почему этой в анонимной функции неопределенной при использовании 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 решили, просто установить
thistoundefined.пример:
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);