Что такое "строгий режим" и как он используется?

Я просматривал ссылку на JavaScript в Mozilla Developer Network, и я наткнулся на то, что называется "strict mode". Я прочитал его, и мне трудно понять, что он делает. Может кто-нибудь кратко объяснить (в общем), какова его цель и как она полезна?

Ответ 1

Его основная цель - сделать больше проверок.

Просто добавьте "use strict"; вверху вашего кода, прежде чем что-либо еще.

Например, blah = 33; действителен JavaScript. Это означает, что вы создаете полностью глобальную переменную blah.

Но в строгом режиме это ошибка, потому что вы не использовали ключевое слово "var" для объявления переменной.

В большинстве случаев вы не хотите создавать глобальные переменные в середине некоторой произвольной области, поэтому большую часть времени, когда blah = 33 записывается, это ошибка, и программист фактически не хотел, чтобы это было глобальная переменная, они хотели написать var blah = 33.

Аналогичным образом запрещается много вещей, которые являются технически обоснованными. NaN = "lol" не вызывает ошибку. Он также не изменяет значение NaN. используя строгие эти (и подобные странные утверждения), вызывают ошибки. Большинство людей это ценят, потому что нет оснований когда-либо писать NaN = "lol", поэтому, скорее всего, была опечатка.

Подробнее читайте на странице MDN в строгом режиме

Ответ 2

Один из аспектов строгого режима, о котором уже не упоминалось в ответе Саймона, заключается в том, что строгий режим устанавливает this в undefined в функции, вызываемые посредством вызова функции.

Итак, подобные вещи

function Obj() {
   this.a = 12;
   this.b = "a";
   this.privilegedMethod = function () {
      this.a++;
      privateMethod();
   };

   function privateMethod() {
     this.b = "foo";
   }
}

приведет к ошибке при вызове privateMethod (поскольку вы не можете добавить свойство в undefined), вместо того, чтобы бесполезно добавлять свойство b к глобальному объекту.

Ответ 3

Был добавлен строгий режим, чтобы было легко статически анализируемое подмножество EcmaScript, которое было бы хорошей мишенью для будущих версий языка. Строгий режим также был разработан в надежде, что разработчики, которые ограничиваются строгим режимом, будут делать меньше ошибок и что ошибки, которые они делают, будут проявляться более очевидными способами.

Harmony, который, мы надеемся, станет следующей крупной версией EcmaScript, будет построен поверх строгой ES5.

Гармония основывается на строгом режиме ES5, чтобы избежать слишком большого количества режимов.

Некоторые другие языковые эксперименты также зависят от строгого режима. SES зависит от способности к строгому режиму ES5.

Эксперимент по дизайну SES (Secure ECMAScript)

Создайте язык программирования возможностей объекта, удалив или восстановив функции в ES5/Strict.

Должен быть прямой перевод с SES на ES5/Strict.

Приложение C стандарта объясняет различия между строгим режимом и нормальным режимом.

Ограничение строгого режима и исключения

  • Идентификаторы "реализует", "интерфейс", "let", "package", "w700", "protected", "public", "static" и "yield" классифицируются как токены FutureReservedWord в строгом режиме, (7.6.12 [?]).
  • Соответствующая реализация при обработке кода строгого режима не может расширять синтаксис NumericLiteral (7.8.3), чтобы включить OctalIntegerLiteral, как описано в B.1.1.
  • Соответствующая реализация при обработке кода строгого режима (см. 10.1.1) не может распространять синтаксис EscapeSequence для включения OctalEscapeSequence, как описано в B.1.2.
  • Назначение необъявленного идентификатора или иначе неразрешимая ссылка не создает свойство в глобальном объекте. Когда простое присваивание происходит в коде строгого режима, его LeftHandSide не должен оценивать неразрешимую ссылку. Если он вызывает исключение ReferenceError (8.7.2). LeftHandSide также может не ссылаться на свойство данных со значением атрибута {[[Writable]]: false}, на свойство accessor со значением атрибута {[[Set]]: undefined}, -устойчивое свойство объекта, внутреннее свойство которого [[Extensible]] имеет значение false. В этих случаях генерируется исключение TypeError (11.13.1).
  • Идентификатор eval или аргументы могут не отображаться как действие LeftHandSideExpression оператора Assignment (11.13) или PostfixExpression (11.3) или как UnaryExpression, на которое действует префикс Increment (11.4.4) или Prefix Decrement (11.4. 5). Аргументы объектов для функций строгого режима определяют неконфигурируемые свойства доступа с именем "вызывающий" и "вызываемый", которые генерируют исключение TypeError при доступе (10.6).
  • Объекты Arguments для функций строгого режима не динамически делят свои значения индексированных значений массива с соответствующими формальными связями параметров их функций. (10.6). Для функций строгого режима, если создается объект аргументов, привязка аргументов локального идентификатора к объекту arguments является неизменной и, следовательно, может быть не целью выражения присваивания. (10.5).
  • Это SyntaxError, если строгий режимный код содержит ObjectLiteral с более чем одним определением любого свойства данных (11.1.5). Это SyntaxError, если Идентификатор "eval" или "Аргументы" Идентификатора происходит как Идентификатор в PropertySetParameterList PropertyAssignment, который содержится в строгом коде, или если его FunctionBody является строгим кодом (11.1.5).
  • Строгий режим eval-код не может создавать переменные или функции в переменной среде вызывающего абонента для eval. Вместо этого создается новая переменная среда и эта среда используется для создания привязки привязки для кода eval (10.4.2).
  • Если это оценивается в коде строгого режима, то это значение не принуждается к объекту. Это значение null или undefined не преобразуется в глобальный объект, а примитивные значения не преобразуются в объекты-обертки. Это значение передается через вызов функции (включая вызовы, выполненные с использованием Function.prototype.apply и Function.prototype.call) не принуждает переданное значение к объекту (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).
  • Когда оператор удаления встречается в коде строгого режима, генерируется SyntaxError, если его UnaryExpression является прямой ссылкой на переменную, аргумент функции или имя функции (11.4.1).
  • Когда оператор удаления встречается в коде строгого режима, генерируется TypeError, если свойство, подлежащее удалению, имеет атрибут {[[Configurable]]: false} (11.4.1). Это SyntaxError, если VariableDeclaration или VariableDeclarationNoIn встречается в строгом коде и его Идентификатор является eval или аргументами (12.2.1).
  • Строковый режим может не включать WithStatement. Возникновение WithStatement в таком контексте является SyntaxError (12.10).
  • Это SyntaxError, если TryStatement с Catch происходит в строгом коде, а Идентификатор производства Catch - это eval или arguments (12.14.1)
  • Это SyntaxError, если идентификатор eval или аргументы появляются в FormalParameterList строгого режима FunctionDeclaration или FunctionExpression (13.1)
  • Функция строгого режима может не иметь двух или более формальных параметров, имеющих одно и то же имя. Попытка создать такую ​​функцию с помощью конструктора FunctionDeclaration, FunctionExpression или Function - это SyntaxError (13.1, 15.3.2).
  • Реализация не может распространяться, помимо значений, определенных в этой спецификации, значениями в строгих режимах функций, называемых вызывающими или аргументами экземпляров функций. Код ECMAScript не может создавать или изменять свойства с этими именами в объектах функций, которые соответствуют строгим режимам (10.6, 13.2, 15.3.4.5.3).
  • SyntaxError использует в строгом режиме код идентификаторов eval или аргументов как идентификатор FunctionDeclaration или FunctionExpression или как формальное имя параметра (13.1). Попытка динамически определить такую ​​строгую функцию режима, используя конструктор Function (15.3.2), выдает исключение SyntaxError.

Ответ 4

В ECMAScript 5 введена концепция строгой моды.

Вызов строгого режима в коде

Строгий режим применяется ко всем скриптам или к отдельной функции. Он не применяется к инструкции блока, заключенной в {} фигурные скобки, попытка применить ее к таким контекстам ничего не делает.

Целый Script:

Скажем, мы создаем app.js, поэтому добавление использования первого выражения script приведет к строгому режиму для всего кода.

// app.js whole script in strict mode syntax
"use strict";
// Now you can start writing your code 

Строгий режим для функции:

Чтобы вызвать строгий режим для функции, поставьте точное утверждение "use strict"; в начале тела функции перед любым другим утверждением.

function yourFunc(){
 "use strict";

 // Your function code logic
}

Строгий режим включает несколько изменений в обычную семантику Javascript. Первый строгий режим устраняет некоторую ошибку JavaScript без изменений, изменяя их, чтобы выбросить ошибки.

Для экземпляра: код с использованием строгого режима

введите описание изображения здесь

В приведенном выше примере кода без использования строгого режима в коде он не выдает ошибку. Поскольку мы обращаемся к переменной x, не объявляя ее. Поэтому в строгом режиме доступ к необъявленной переменной вызывает ошибку.

Теперь попробуйте обратиться к переменной x, не объявив ее без строгого режима.

(function(){
    x = 3;
})();

// Will not throw an error

Преимущество использования строгого режима:

  • Устранить ошибки JavaScript без ошибок.
  • Исправлена ​​ошибка, которая затрудняет выполнение JavaScript-движка.
  • Сделать код быстрее, чем тот же код, который не работает в строгом режиме
  • Запрещает некоторый синтаксис, который может быть определен в будущей версии ECMAScript.

Ответ 5

Строгий режим делает несколько изменений в обычной семантике JavaScript.

  • В строгом режиме исключаются некоторые ошибки JavaScript, изменяя их, чтобы вызывать ошибки.

  • строгий режим исправляет ошибки, которые затрудняют выполнение JavaScript-движками.

    Строковый режим
  • запрещает некоторый синтаксис, который может быть определен в будущих версиях ECMAScript.

Ответ 6

ECMAScript5 вводит некоторые новые объекты и свойства, а также так называемый "strict mode".

Строгий режим - это подмножество языка, исключающего устаревшие функции. Строгий режим является необязательным и не требуется, что означает, что если вы хотите, чтобы ваш код запускался в строгий режим, вы заявляете свое намерение (один раз за функцию или один раз для целая программа) следующую строку:

"use strict";

Ответ 7

2017, и я наконец нашел документацию:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

Строгий режим - это вариант для ограниченного варианта JavaScript. Строгий режим - это не просто подмножество: он намеренно имеет разные семантика от обычного кода. Браузеры, не поддерживающие строгий режим, будут запускать строгий режим кода с различным поведением в браузерах, которые делают, поэтому не полагайтесь на строгий режим без тестирования функций для поддержки соответствующие аспекты строгого режима. Строгий режимный код и нестрогий режим код может сосуществовать, поэтому скрипты могут входить в строгий режим постепенно.


Строгий режим делает несколько изменений в обычной семантике JavaScript. Во-первых, строгий режим устраняет некоторые ошибки JavaScript без меняя их, чтобы выбросить ошибки. Во-вторых, строгий режим исправляет ошибки, которые затрудняют работу JavaScript-движков для оптимизации: строгий режимный код иногда может запускаться быстрее, чем идентичный код, который не является строгим. В-третьих, строгий режим запрещает некоторый синтаксис вероятно, будет определен в будущих версиях ECMAScript.