Как "использовать строгий" изменить правила для "этого" в Javascript?
Я пытаюсь понять, какое правило для "этого", что "использовать строгое"; модифицируется в приведенном ниже случае.
После прочтения ( http://unschooled.org/2012/03/understanding-javascript-this/) мое лучшее предположение состоит в том, что поскольку функция isStrictModeOn() ни к чему не "привязана", это относится к нулю. Предполагается, что это более разумная альтернатива Javascript, просто присоединяющая this к глобальному объекту. Это правильное толкование изменений, которые вносит "строгий контроль" в этом случае?
http://www.novogeek.com/post/ECMAScript-5-Strict-mode-support-in-browsers-What-does-this-mean.aspx
function isStrictMode(){
return !this;
}
//returns false, since 'this' refers to global object and '!this' becomes false
function isStrictModeOn(){
"use strict";
return !this;
}
//returns true, since in strict mode, the keyword 'this' does not refer to global object, unlike traditional JS. So here,'this' is null and '!this' becomes true.
1 ответ
Это почти правильно. В строгом режиме, когда функция вызывается без получателя, this
является undefined
(не null
). Лучшая версия этой функции:
function isStrict() {
"use strict";
return (typeof this) === 'undefined';
}
Неотъемлемая проблема с такими функциями заключается в том, что "строгость" определяется лексически, как область действия, поэтому она статична. Функция тестера, которая включает в себя "use strict";
не очень полезно; это действительно только говорит вам, понимает ли среда выполнения JavaScript строгий режим. Один без своего "use strict";
говорит вам, находится ли лексический контекст, в котором он определен, в строгом режиме. То есть:
function isStrict() {
function test() {
return (typeof this) === 'undefined';
}
return test();
}
при вызове скажет, "use strict";
действовал для области, в которой определена функция. Я думаю, это может быть полезно. Однако, если ссылка на эту функцию "просачивается" в какой-то другой контекст, "строгость" которого отличается, она будет продолжать сообщать о ее статической строгости в момент ее определения.
Лично я хотел бы просто убедиться, что мой код определенно находится в строгом режиме, вызывая "use strict";
на самом внешнем слое возможно. Таким образом, нет необходимости проверять это.