«use strict» Строгий режим в Javascript
Директива «use strict» введена в ECMAScript 5 для задания строгого режима выполнения кода. Директива — это не инструкция, но достаточно близкое понятие, чтобы можно было рассмотреть её в разделе инструкций. Во фразе «use strict» нет ключевых слов Javascript, это лишь строковый литерал, который игнорируется более ранними интерпретаторами ECMAScript 3. Если она помещена в начала сценария или тела функции, она имеет специальное значение для интерпретатора ECMAScript 5.
Назначение директивы «use strict» состоит в том, чтобы при выполнении данного кода переключить интерпретатор в строгий режим. В строгом режиме используется ограниченное подмножество языка, устраняющее ряд существенных дефектов платформы и обеспечивающее повышенные уровни проверки ошибок и безопасности. Ниже рассматриваются наиболее важные различия между строгим и нестрогим режимами.
● Инструкция with в строгом режиме запрещена.
● В строгом режиме все переменные должны быть объявлены. Если присвоить значение идентификатору, не являющемуся объявленной переменной, параметром или свойством глобального объекта, то будет сгенерирована ошибка ReferenceError. В нестрогом режиме в этом случае будет неявно создана глобальная переменная путем добавления нового свойства в глобальный объект.
● В строгом режиме в функции, вызванной как функция (а не метод объекта), ключевое слово this имеет значение undefined. В нестрогом режиме всем функциям, вызываемым как функции, посредством значения this передается глобальный объект. Это отличие можно использовать для выяснения того, в каком режиме работает код.
var hasStrictMode = ( function() { "use strict"; return this === undefined }() );
● В строгом режиме попытки присвоить значения свойствам, недоступным для записи (созданным в режиме «только чтение»), или создать новые свойства в нерасширяемых объектах, а также попытка создания свойства несуществующего объекта порождают исключение ТуреЕrror. В нестрогом режиме интерпретатор никак не реагирует на неудачу. Аналогичным образом в строгом режиме попытка удалить неконфигурируемое свойство или значение приводит к ошибке ТуреЕrror или SuntaxError. В нестрогом режиме попытка приводит к неудаче (но интерпретатор никак не реагирует на это), и выражение delete возвращает значение false.
● В строгом режиме программный код, передаваемый функции eval(), не может объявлять переменные или определять функции в области видимости вызывающего программного кода (вызывающей функции), как это возможно в нестрогом режиме. Вместо этого переменные и функции помещаются в новую область видимости, создаваемую для функции. Т.е. переменные и функции в этом случае находятся в новой области видимости, созданной функцией eval(). При завершении функции eval() эта область видимости уничтожается.
● В строгом режиме не разрешены восьмеричные целые литералы (начинающиеся с 0 без следующего символа х). Хотя и в нестрогом режиме восьмеричные символы поддерживаются не во всех реализациях рабочей среды.
● В строгом режиме идентификаторы eval и arguments считаются ключевыми словами, и присваивать им значения запрещено.
● В строгом режиме попытка определить в литерале объекта два или более свойств с одинаковыми именами считается синтаксической ошибкой. (В нестрогом режиме ошибка не возникает.)
● В строгом режиме определение двух или более параметров с одинаковыми именами в объявлении функции считается синтаксической ошибкой. (В нестрогом режиме ошибка не возникает.)
● В строгом режиме ограничивается возможность просмотра стека вызовов. Попытки обратиться к свойствамarguments.callerиarguments.calleeв строгом режиме возбуждают исключениеТуреЕrror. Попытки прочитать свойстваcallerиargumentsфункций в строгом режиме также возбуждают исключениеТуреЕггог. (Некоторые реализации определяют эти свойства в нестрогих функциях.)
В итоге, зачем использовать "use strict";?
В строгом режиме:
- некоторые ошибки можно найти быстрее,
- более опасные и не полезные черты JavaScript либо запрещены, либо приводят к ошибке.
Как использовать "use strict";?
Чтобы включить строгий режим в целом скрипте, надо поставить установку "use strict"; или 'use strict'; в начало скрипта.
"use strict"; // код здесь обрабатывается в строгом режиме
Чтобы включить строгий режим в функции, надо поставить установку в начало кода функции.
// код здесь обрабатывается в неограниченном режиме
function f() {
"use strict";
// код здесь обрабатывается в строгом режиме
}
// код здесь обрабатывается в неограниченном режимеТеперь рассмотрим на конкретных примерах в чём различие между строгим режимом и неограниченным режимом
В строгом режиме:
- нельзя присваивать значение в неопределённую переменную (спецификация §11.13.1). В неограниченном режиме создается глобальная переменная.
- Также нельзя присваивать значение в свойство данных только для чтения.
- нельзя использовать инструкцию
with(спецификация §12.10).
- нельзя определить повторные свойства в литерале объекта (спецификация §11.1.5).
- изменения объекта
argumentsне изменяют аргументы (спецификация §10.6).
deleteприводит к ошибке, если аргумент - не изменяемое свойство объекта(спецификация §11.4.1).
evalне может инстанциировать переменные и функции в контексте вызова(спецификация §10.4.2).
thisне преобразуется в объект, а если значениеthis-undefinedилиnull, то не преобразуется в глобальный объект (спецификация §10.4.3).
evalиarguments- нельзя изменить или использовать в качестве имени(спецификация §11.4.4, §11.4.5, §11.13, §12.2.1, §12.10, §12.14.1, §13.1).
- нельзя использовать
argument.callerиarguments.callee(спецификация §13.2).
- больше слов, зарезервированных для использования в будущем (спецификация §7.6.1.2).
Репетитор | IT mentor
