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

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

10 ответов

Решение

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

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

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

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

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

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

Узнайте больше на странице MDN о строгом режиме

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

Итак, такие вещи

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

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

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

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

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

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

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

SES (безопасный ECMAScript) эксперимент по проектированию

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

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

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

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

  • Идентификаторы "Implements", "interface", "let", "package", "private", "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}, на свойство метода доступа со значением атрибута {[[Set]]:undefined} или на несуществующее свойство объекта, внутреннее свойство которого [[Extensible]] имеет значение false. В этих случаях выдается исключение TypeError (11.13.1).
  • Идентификатор eval или аргументы могут не отображаться как выражение LeftHandSideExpress оператора присваивания (11.13) или выражения PostfixExpression (11.3) или как выражение UnaryExpression, оперируемое оператором увеличения префикса (11.4.4) или оператора уменьшения префикса (11.4.5), Объекты аргументов для функций строгого режима определяют неконфигурируемые свойства средства доступа с именами "вызывающий" и "вызываемый", которые генерируют исключение TypeError при доступе (10.6).
  • Объекты аргументов для функций строгого режима динамически не разделяют значения своих индексированных свойств массива с соответствующими привязками формальных параметров своих функций. (10.6). Для функций строгого режима, если создается объект аргументов, привязка аргументов локального идентификатора к объекту аргументов является неизменной и, следовательно, может не являться целью выражения присваивания. (10.5).
  • Это ошибка SyntaxError, если код строгого режима содержит ObjectLiteral с более чем одним определением какого-либо свойства данных (11.1.5). Это SyntaxError, если Идентификатор "eval" или Идентификатор "arguments" встречается как Идентификатор в PropertySetParameterList PropertyAssignment, который содержится в строгом коде, или если его FunctionBody является строгим кодом (11.1.5).
  • Eval-код строгого режима не может создавать экземпляры переменных или функций в переменной среде вызывающей стороны для eval. Вместо этого создается новая переменная среда, и эта среда используется для создания экземпляров привязки объявлений для кода eval (10.4.2).
  • Если это оценено в коде строгого режима, то это значение не приводится к объекту. Это значение null или undefined не преобразуется в глобальный объект, а примитивные значения не преобразуются в объекты-оболочки. Значение this, переданное через вызов функции (включая вызовы, выполненные с использованием Function.prototype.apply и Function.prototype.call), не приводит к принудительной передаче переданного значения this объекту (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 или arguments (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).
  • Реализация не может расширять, помимо того, что определено в этой спецификации, значения в функциях строгого режима свойств, называемых caller, или аргументов экземпляров функций. Код ECMAScript не может создавать или изменять свойства с этими именами на объектах функций, которые соответствуют функциям строгого режима (10.6, 13.2, 15.3.4.5.3).
  • Это ошибка SyntaxError для использования в коде строгого режима идентификаторов eval или аргументов в качестве идентификатора FunctionDeclaration или FunctionExpression или в качестве формального имени параметра (13.1). Попытка динамически определить такую ​​функцию строгого режима с помощью конструктора Function (15.3.2) вызовет исключение SyntaxError.

ECMAScript 5 представил концепцию строгого режима.

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

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

Весь сценарий:

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

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

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

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

function yourFunc(){
 "use strict";

 // Your function code logic
}

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

Например: код в строгом режиме

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

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

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

// Will not throw an error

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

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

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

  • строгий режим устраняет некоторые тихие ошибки JavaScript, изменяя их на ошибки.

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

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

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

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

"use strict";

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

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


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

Строгий режим - это новая функция в ECMAScript 5, которая позволяет разработчикам помещать код в «строгий» контекст. Этот строгий контекст помогает разработчикам избегать ошибок, создавая больше исключений.

Как использовать строгий режим в js?

Простой. Поместите это в начало программы, чтобы включить его для всего скрипта:

      "use strict";

Или поместите его в функцию, чтобы включить строгий режим только в этом контексте.

      function imStrict(){
  "use strict";
  // … your code (executes in strict mode) …
}

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

1. Функции - это область действия блока внутри области действия блока, определяющая видимость или доступность переменной или другого ресурса в области вашего кода.

Вариант I (без строгого режима)

Случай II (строгий режим)

2. Выдает ошибку / исключение, если переменным присвоено значение, но не определен какой-либо тип. В приведенном выше примере "a" не объявлено никакого значения (let, const, var)

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

Это: общедоступный интерфейс реализации, позволяющий пакету закрытый защищенный статический выход. Например,

4. «this» внутри простой функции указывает на «undefined» в строгом режиме. Ключевое слово this относится к объекту, который называется функцией. Если объект не указан, функции в строгом режиме вернут undefined, а функции в нормальном режиме вернут глобальный объект (окно). Ниже приведены примеры для лучшего понимания.

Вариант I (без строгого режима)

Случай II (строгий режим)

5. Удаление переменной (или объекта) и функции не допускается.

6. Дублирование имени параметра запрещено.

По умолчанию тело класса выполняется в строгом режиме. например, для: 

      class Rectangle {
//code executed here are in Strict mode
}

использованная литература

  1. Джон Ресиг
  2. MDN
  3. W3School

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

Ниже приведена цитата из MDN:

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

Вопрос:
Ниже приводится проблема, с которой я столкнулся, я следовал учебному пособию, и в итоге он попытался скомпилировать следующее scss файл и пытается сгенерировать код CSS из него,

.fatty{
  width: percentage(6/7);
}

используя следующее gulpfile.js задача:

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    return gulp.src('app/scss/styles.scss')
        .pipe(sass())
        .pipe(gulp.dest('app/css'))
});

Итак, ошибка, которую я получаю, заключается в следующем:

~/htdocs/Learning/gulp1/node_modules/gulp-sass/index.js:66
    let sassMap;
    ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
// stacktrace here...

Решение:
Так это показывает мне index.js файл, который находится внутри моего модуля gulp-sass (который в основном заблокирован и не должен редактироваться). Но если я пойду и добавлю "use_strict" на вершине этого index.js файл, он выполняет мою задачу гладко.

Я был беспомощен, поэтому я продолжаю использовать это как решение! Но затем, пройдя некоторые другие вопросы и ответы, я увидел следующий ответ:

sudo npm install -g n
sudo n stable

и вскоре я обновил свои NodeJ (до Version10.x), а затем перестроил Gulp, выполнив следующие команды, как дал мне указание терминала:

npm rebuild node-sass --force

И все в порядке. Так вот как это было решено. Я отменил изменения, которые я сделал для index.js файл модуля gulp. И теперь все идет гладко.

Надеюсь, что этот ответ будет полезен для кого-то там!

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