что такое "строгий режим" и как он используется? - PullRequest
130 голосов
/ 28 декабря 2011

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

Ответы [ 8 ]

147 голосов
/ 28 декабря 2011

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

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

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

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

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

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

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

33 голосов
/ 28 декабря 2011

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

Таким образом, подобные

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

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

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

21 голосов
/ 28 декабря 2011

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

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

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

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

Эксперимент по проектированию SES (Secure ECMAScript)

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

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

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

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

  • Идентификаторы "Implements", "interface", "let", "package", "private", "Защищенные "," публичные "," статические "и" 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 или аргументы могут не отображаться в виде LeftHandSideExpression оператора Assignment (11.13) или выражения PostfixExpression (11.3) или в качестве оператора UnaryExpressionс помощью оператора увеличения префикса (11.4.4) или оператора уменьшения префикса (11.4.5).Объекты аргументов для функций строгого режима определяют неконфигурируемые свойства аксессора с именами «caller» и «callee», которые генерируют исключение 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).
  • Если это вычисляется в коде строгого режима, то значение this не приводится к объекту.Значение 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 или аргументами (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.
6 голосов
/ 01 января 2016

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, изменяя их на выдачу ошибок.

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

enter image description here

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

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

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

// Will not throw an error

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

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

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

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

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

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

1 голос
/ 14 апреля 2017

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

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


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

1 голос
/ 15 августа 2015

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

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

"use strict";
0 голосов
/ 13 мая 2018

Вопрос:
Вот проблема, с которой я столкнулся, я следовал учебному пособию, и в итоге я попытался скомпилировать следующий файл 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 файла, моя задача будет выполнена гладко.

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

sudo npm install -g n
sudo n stable

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

npm rebuild node-sass --force

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

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

...