Как "использовать строгий" изменить правила для "этого" в 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"; на самом внешнем слое возможно. Таким образом, нет необходимости проверять это.

Другие вопросы по тегам