«use strict» Строгий режим в Javascript

«use strict» Строгий режим в Javascript, image #1

Директива «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). В неограниченном режиме создается глобальная переменная.
«use strict» Строгий режим в Javascript, image #2
  • Также нельзя присваивать значение в свойство данных только для чтения.
«use strict» Строгий режим в Javascript, image #3
  • нельзя использовать инструкцию with (спецификация §12.10).
«use strict» Строгий режим в Javascript, image #4
  • нельзя определить повторные свойства в литерале объекта (спецификация §11.1.5).
«use strict» Строгий режим в Javascript, image #5
  • нельзя определить повторные формальные параметры функции (спецификация §13.1, §15.3.2).
«use strict» Строгий режим в Javascript, image #6
  • изменения объекта arguments не изменяют аргументы (спецификация §10.6).
«use strict» Строгий режим в Javascript, image #7
  • delete приводит к ошибке, если аргумент - не изменяемое свойство объекта(спецификация §11.4.1).
«use strict» Строгий режим в Javascript, image #8
  • eval не может инстанциировать переменные и функции в контексте вызова(спецификация §10.4.2).
«use strict» Строгий режим в Javascript, image #9
  • this не преобразуется в объект, а если значение this - undefined или null, то не преобразуется в глобальный объект (спецификация §10.4.3).
«use strict» Строгий режим в Javascript, image #10
«use strict» Строгий режим в Javascript, image #11
  • нельзя использовать argument.caller и arguments.callee (спецификация §13.2).
«use strict» Строгий режим в Javascript, image #12
  • больше слов, зарезервированных для использования в будущем (спецификация §7.6.1.2).
«use strict» Строгий режим в Javascript, image #13
  • нельзя использовать литералы восьмеричной СС (спецификация B.1.1, B.1.2).
«use strict» Строгий режим в Javascript, image #14
Больше интересных статей читай по хэштегу #article@physics_math в группе Physics.Math.Code.BooksЕсли Вы хотите разобраться в физике, математике или программировании, но не понимаете объяснения преподавателей в школе или университете. Однако, у Вас есть желание хорошо закончить учебу и разбираться в точных предметах? Мы сможем помочь Вам в этом. Репетиторов по физике, высшей математике, программированию, информатике, иностранным языкам Вы найдете в
Репетитор | IT mentor
807 views·16 shares