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


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

пример:

(function () {
    "use strict";

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

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

3 76

3 ответа:

это потому, что до ECMAscript 262 edition 5, была большая путаница, если люди, которые где используют constructor pattern забыл использовать new ключевое слово. Если вы забыли использовать new при вызове функции-конструктора в ES3, this ссылается на глобальный объект (window в браузере), и вы бы забили глобальный объект переменными.

это было ужасное поведение, и поэтому люди в ECMA решили, просто установить this to 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"

(что является гораздо лучшим поведением)

существует механизм под названием "бокс", который обертывает или изменяет 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);