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