Использование 'use strict';
не приведет к внезапному улучшению вашего кода.
Строгий режим JavaScript - это функция в ECMAScript 5. Вы можете включить строгий режим, объявив это в верхней части скрипта / функции.
'use strict';
Когда механизм JavaScript видит эту директиву , он начинает интерпретировать код в специальном режиме. В этом режиме ошибки возникают при обнаружении определенных методов кодирования, которые могут оказаться потенциальными ошибками (что является причиной строгого режима).
Рассмотрим следующий пример:
var a = 365;
var b = 030;
В своей одержимости выстраиванием числовых литералов разработчик непреднамеренно инициализировал переменную b
восьмеричным литералом. Нестрогий режим интерпретирует это как числовой литерал со значением 24
(по основанию 10). Однако строгий режим вызовет ошибку.
Неполный список специализаций в строгом режиме см. В этом ответе.
Где использовать 'use strict';
?
-
В моем новом приложении JavaScript: Абсолютно! Строгий режим можно использовать в качестве информатора, когда вы делаете что-то глупое со своим кодом.
-
В моем существующем коде JavaScript: Вероятно, нет! Если в вашем существующем коде JavaScript есть инструкции, запрещенные в строгом режиме, приложение просто сломается. Если вам нужен строгий режим, вы должны быть готовы к отладке и исправлению существующего кода. Вот почему с использованием 'use strict';
внезапно не улучшит ваш код .
Как использовать строгий режим?
-
Вставьте инструкцию 'use strict';
поверх своего скрипта:
// File: myscript.js
'use strict';
var a = 2;
....
Обратите внимание, что все в файле myscript.js
будет интерпретироваться в строгом режиме.
-
Или вставьте инструкцию 'use strict';
поверх тела функции:
function doSomething() {
'use strict';
...
}
Все, что находится в лексической области функции doSomething
, будет интерпретироваться в строгом режиме. Здесь важно слово лексическая область . Например, если ваш код strict вызывает функцию библиотеки, которая not strict , в строгом режиме выполняется только ваш код, а не вызываемая функция. См. Этот ответ для лучшего объяснения.
Что запрещено в строгом режиме?
Я нашел красивую статью, описывающую несколько вещей, которые запрещены в строгом режиме (обратите внимание, что это не исключительный список):
Область действия
Исторически сложилось так, что JavaScript не понимал, как функции
ограничены. Иногда они кажутся статическими, но некоторые
функции заставляют их вести себя так, как будто они имеют динамическую область видимости. Это
сбивает с толку, затрудняет чтение и понимание программ.
Непонимание вызывает ошибки. Это тоже проблема для производительности.
Статическая область видимости позволяет связывать переменную при компиляции.
время, но требование динамической области означает, что привязка должна быть
отложено до времени выполнения, что обеспечивает значительную производительность
штраф.
Строгий режим требует, чтобы все привязки переменных выполнялись статически.
Это означает, что функции, которые ранее требовали динамической привязки
должны быть исключены или изменены. В частности, оператор with
устранена, а функция eval может вмешиваться в
среда его вызывающего строго ограничена.
Одним из преимуществ строгого кода является то, что такие инструменты, как YUI Compressor
может лучше справиться с его обработкой.
Подразумеваемые глобальные переменные
JavaScript подразумевает глобальные переменные. Если
вы не объявляете переменную явно, глобальная переменная
неявно заявлено для вас. Это упрощает программирование для
новички, потому что они могут пренебречь некоторыми основными домашними делами
работа по дому. Но это делает управление более крупными программами гораздо более сложным.
сложно, и это значительно снижает надежность. Так что в строгом
режиме подразумеваемые глобальные переменные больше не создаются. Вам следует
явно объявите все свои переменные.
Глобальная утечка
Существует ряд ситуаций, которые могут вызвать this
быть привязанным к глобальному объекту. Например, если вы забыли
предоставить префикс new
при вызове функции конструктора,
конструктор this
будет неожиданно привязан к глобальному объекту, поэтому
вместо инициализации нового объекта он будет молча
вмешательство в глобальные переменные. В этих ситуациях строгий режим будет
вместо этого привяжите this
к undefined
, что приведет к тому, что конструктор
вместо этого генерировать исключение, позволяя обнаруживать ошибку.
раньше.
Шумный отказ
JavaScript всегда имел свойства только для чтения, но вы
не мог создать их самостоятельно, пока ES5 не Object.createProperty
функция раскрыла эту возможность. Если вы пытались присвоить значение
к свойству только для чтения, он потерпит неудачу без предупреждения. Задание будет
не изменять значение свойства, но ваша программа будет работать как
хотя это было. Это угроза целостности, из-за которой программы
перейти в противоречивое состояние. В строгом режиме при попытке изменить
свойство только для чтения вызовет исключение.
Восьмеричное число
Восьмеричное (или основание 8) представление чисел было чрезвычайно
полезно при программировании на уровне машины на машинах, слово которых
размеры были кратны 3. При работе с CDC вам потребовалось восьмеричное число.
6600 мэйнфреймов с размером слова 60 бит. Если бы вы могли прочитать
восьмеричный, вы можете рассматривать слово как 20 цифр. Представлены две цифры
код операции, и одна цифра определяет один из 8 регистров. Вовремя
медленный переход от машинных кодов к языкам высокого уровня, это было
считается полезным для предоставления восьмеричных форм в языках программирования.
В C крайне неудачное представление восьмеричности было
selected: ведущий ноль. Итак, в C 0100
означает 64, а не 100, а 08
- это
ошибка, а не 8. К большому сожалению, этот анахронизм был
скопировано почти на все современные языки, включая JavaScript, где
он используется только для создания ошибок. Другой цели у него нет. Так что в
строгий режим, восьмеричные формы больше не допускаются.
И так далее
Псевдо-массив аргументов становится немного больше
как массив в ES5. В строгом режиме он теряет свои callee
и caller
характеристики. Это позволяет передать ваш arguments
в ненадежный
код, не отказываясь от конфиденциального контекста. Так же
arguments
свойство функций исключено.
В строгом режиме повторяющиеся ключи в функциональном литерале будут создавать
ошибка синтаксиса. У функции не может быть двух параметров с одинаковым именем.
Функция не может иметь переменную с тем же именем, что и одна из ее
параметры. Функция не может delete
собственных переменных. Попытка
delete
ненастраиваемое свойство теперь вызывает исключение. Примитивный
значения не переносятся неявно.
Зарезервированные слова для будущих версий JavaScript
ECMAScript 5 добавляет список зарезервированных слов. Если вы используете их как переменные или аргументы, строгий режим выдаст ошибку. Зарезервированные слова:
implements
, interface
, let
, package
, private
, protected
, public
, <671265986525140> и <672586725>
Дополнительная литература
Ответы здесь старые, но неверные. Основная причина в пользу строгого режима заключалась не в предотвращении ошибок программирования, а в том, чтобы сделать JavaScript с лексической областью видимости, чтобы его можно было статически анализировать:]