Назначение директивы "use strict"
состоит в том, чтобы показать, что следующий за ней программный код (в сценарии или функции) является строгим кодом. Строгим считается программный код верхнего уровня (не внутри функций), если в сценарии имеется директива "use strict".
Строгим считается тело функции, если она определяется внутри строгого программного кода или если она содержит директиву "use strict
". Строгим считается программный код, передаваемый методу eval(),
если вызов eval()
выполняется из строгого программного кода или если строка с кодом содержит директиву "use strict".
Строгий программный код выполняется в строгом режиме. Согласно стандарту ECMAScript 5, строгий режим определяет ограниченное подмножество языка, благодаря чему исправляет некоторые недостатки языка, а также обеспечивает более строгую проверку на наличие ошибок и повышенный уровень безопасности. Ниже перечислены различия между строгим и нестрогим режимами (первые три имеют особенно большое значение):
• В строгом режиме не допускается использование инструкции with
.
• В строгом режиме все переменные должны объявляться: если попытаться присвоить значение идентификатору, который не является объявленной переменной, функцией, параметром функции, параметром конструкции catch
или свойством глобального объекта, возбуждается исключение ReferenceError
. (В нестрогом режиме такая попытка просто создаст новую глобальную переменную и добавит ее в виде свойства в глобальный объект.)
• В строгом режиме функции, которые вызываются как функции (а не как методы), получают в ссылке this
значение undefined
. (В нестрогом режиме функции, которые вызываются как функции, всегда получают в ссылке this
глобальный объект.) Это отличие можно использовать, чтобы определить, поддерживает ли та или иная реализация строгий режим:
var hasStrictMode = (function() { "use strict"; return this===undefined}());
Кроме того, когда функция вызывается в строгом режиме с помощью саll()
или аррlу(),
значение ссылки this
в точности соответствует значению, переданному в первом аргументе функции саll()
или аррlу()
. (В нестрогом режиме значения null
и undefined
замещаются ссылкой на глобальный объект, а простые значения преобразуются в объекты.)
• В строгом режиме попытки присвоить значения свойствам, недоступным для записи, или создать новые свойства в нерасширяемых объектах порождают исключение TypeError
. (В нестрогом режиме эти попытки просто игнорируются.)
• В строгом режиме программный код, передаваемый функции eval(),
не может объявлять переменные или функции в области видимости вызывающего программного кода, как это возможно в нестрогом режиме. Вместо этого переменные и функции помещаются в новую область видимости, создаваемую для функции eval().
Эта область видимости исчезает, как только eval()
вернет управление.
• В строгом режиме объект arguments
(раздел 8.3.2) в функции хранит статическую копию значений, переданных функции. В нестрогом режиме объект arguments
ведет себя иначе - элементы массива arguments
и именованные параметры функции ссылаются на одни и те же значения.
• В строгом режиме возбуждается исключение SyntaxError
, если оператору delete
передать неквалифицированный идентификатор, такой как имя переменной, функции или параметра функции. (В нестрогом режиме такое выражение delete
не выполнит никаких действий и вернет false
.)
• В строгом режиме попытка удалить ненастраиваемое свойство приведет к исключению ТуреЕггог
. (В нестрогом режиме эта попытка просто завершится неудачей и выражение delete
вернет false
.)
• В строгом режиме попытка определить в литерале объекта два или более свойств с одинаковыми именами считается синтаксической ошибкой. (В нестрогом режиме ошибка не возникает.)
• В строгом режиме определение двух или более параметров с одинаковыми именами в объявлении функции считается синтаксической ошибкой. (В нестрогом режиме ошибка не возникает.)
• В строгом режиме не допускается использовать литералы восьмеричных целых чисел (начинающихся с 0, за которым не следует символ х). (В нестрогом режиме некоторые реализации позволяют использовать восьмеричные литералы.)
Читать дальше
Конец ознакомительного отрывка
Купить книгу