В своем стремлении выстроить числовые литералы разработчик непреднамеренно инициализировал переменную b
с восьмеричным литералом. Нестрогий режим интерпретирует это как числовой литерал со значением 24
(в базе 10). Однако строгий режим выдаст ошибку.
Объем
Исторически JavaScript был сбит с толку о том, как функции ограничены. Иногда они кажутся статически ограниченными, но некоторые функции заставляют их вести себя так, как будто они динамически ограничены. Это сбивает с толку, затрудняя чтение и понимание программ. Непонимание вызывает ошибки. Это также является проблемой для производительности. Статическая область видимости позволила бы связывание переменных во время компиляции, но требование динамической области действия означает, что связывание должно быть отложено до времени выполнения, что приводит к значительному снижению производительности.
Строгий режим требует статического связывания всех переменных. Это означает, что функции, которые ранее требовали динамического связывания, должны быть удалены или изменены. В частности, оператор with исключен, а способность функции eval вмешиваться в среду своего вызывающего строго ограничена.
Одним из преимуществ строгого кода является то, что такие инструменты, как YUI Compressor,
могут лучше обрабатывать его.
Подразумеваемые глобальные переменные
JavaScript подразумевает глобальные переменные. Если вы явно не объявляете переменную, глобальная переменная неявно объявляется для вас. Это облегчает программирование для начинающих, потому что они могут пренебречь некоторыми из своих основных дел по дому. Но это значительно усложняет управление большими программами и значительно снижает надежность. Таким образом, в строгом режиме подразумеваемые глобальные переменные больше не создаются. Вы должны явно объявить все ваши переменные.
Глобальная утечка
Существует ряд ситуаций, которые могут привести this
к привязке к глобальному объекту. Например, если вы забудете предоставить new
префикс при вызове функции конструктора, конструктор this
будет неожиданно привязан к глобальному объекту, поэтому вместо инициализации нового объекта он будет молча вмешиваться в глобальные переменные. В этих ситуациях строгий режим вместо этого будет привязываться this
к undefined
, что заставит конструктор вместо этого выдать исключение, что позволит обнаружить ошибку намного быстрее.
Шумный отказ
JavaScript всегда имел свойства только для чтения, но вы не можете создавать их самостоятельно, пока Object.createProperty
функция ES5 не продемонстрирует эту возможность. Если вы попытаетесь присвоить значение свойству только для чтения, оно молча завершится неудачей. Назначение не изменит значение свойства, но ваша программа будет работать так, как если бы это было. Это угроза целостности, которая может привести к тому, что программы перейдут в несовместимое состояние. В строгом режиме попытка изменить свойство только для чтения вызовет исключение.
восьмеричный
Восьмеричное (или базовое 8) представление чисел было чрезвычайно полезно при программировании на уровне машины на машинах с размерами слов, кратными 3. Вам нужно восьмеричное значение при работе с мэйнфреймом CDC 6600, который имел размер слова 60 бит. Если бы вы могли читать восьмеричное, вы могли бы смотреть на слово как 20 цифр. Две цифры представляют код операции, а одна цифра обозначает один из 8 регистров. Во время медленного перехода от машинных кодов к языкам высокого уровня считалось полезным предоставить восьмеричные формы в языках программирования.
В C было выбрано крайне неудачное представление восьмеричности: ведущий ноль. Таким образом, в C 0100
означает 64, а не 100, и 08
является ошибкой, а не 8. Более того, к сожалению, этот анахронизм был скопирован почти на все современные языки, включая JavaScript, где он используется только для создания ошибок. У него нет другой цели. Так что в строгом режиме восьмеричные формы больше не разрешены.
И так далее
Псевдомассив arguments становится более похожим на массив в ES5. В строгом режиме, она теряет свое callee
и caller
свойство. Это позволяет передать ваш arguments
ненадежный код, не отказываясь от большого количества конфиденциального контекста. Также
arguments
исключено свойство функций.
В строгом режиме дубликаты ключей в функциональном литерале вызовут синтаксическую ошибку. Функция не может иметь два параметра с одинаковым именем. Функция не может иметь переменную с тем же именем, что и один из ее параметров. Функция не может иметь delete
свои собственные переменные. Попытка
delete
ненастраиваемого свойства теперь вызывает исключение. Примитивные значения не подразумеваются.
ECMAScript 5 добавляет список зарезервированных слов. Если вы используете их в качестве переменных или аргументов, строгий режим выдаст ошибку. Зарезервированные слова: