Кратко
Скопировано'use strict'
включает строгий режим выполнения JavaScript. Эта строка должна располагаться в самом начале скрипта, иначе строгий режим не будет работать. В строгом режиме интерпретатор будет явно выбрасывать ошибки на действия, которые ранее пропускал. Если строгий режим был включён, то отключить его для файла уже нельзя.
Пример
Скопировано'use strict' // Располагаем строку в самом начале файла!const name = 'Alex'// ... другой код
'use strict' // Располагаем строку в самом начале файла! const name = 'Alex' // ... другой код
Как понять
СкопированоСтрогий режим был введён в JavaScript со стандартом ECMAScript 5 в 2009 году.
Этот стандарт добавил много нового в язык, но чтобы старые браузеры могли продолжать работать, был введён специальный строгий режим выполнения, который включал новые функции языка.
Строгий режим делает следующее:
- Выбрасывает ошибки, когда в коде используются некоторые небезопасные конструкции.
- Выключает функции языка, которые запутывают код и потому не должны использоваться.
- Предотвращает использование слов, которые могут быть использованы в качестве ключевых в будущем.
Давайте подробнее посмотрим некоторые важные ограничения, которые накладывает включение строгого режима.
Нельзя использовать переменные без объявления
СкопированоИнтерпретатор в строгом режиме выбросит ошибку, если обратиться к переменной без её объявления:
'use strict'const name = 'Anna'console.log(name)// Annaage = 24console.log(age)// Uncaught ReferenceError: age is not defined
'use strict' const name = 'Anna' console.log(name) // Anna age = 24 console.log(age) // Uncaught ReferenceError: age is not defined
Без строгого режима интерпретатор в таком случае создаст переменную age
в глобальной области видимости. Если выполнять код из примера в консоли браузера без 'use strict'
, то все выполнится без ошибок, а в глобальный объект window
запишется поле age
со значением 24
.
Явная ошибка если значение поля нельзя изменить или удалить
СкопированоС помощью методов Object
или Object
в JavaScript можно запретить перезаписывать поля объекта. При включённом строгом режиме попытка перезаписать поле приведёт к ошибке.
'use strict'const obj = {}Object.defineProperty(obj, 'someProp', { value: 'Alex', writable:false })console.log(obj.someProp)// Alexobj.someProp = 'James'// Uncaught TypeError: Cannot assign to read only property 'someProp' of object #<Object>
'use strict' const obj = {} Object.defineProperty(obj, 'someProp', { value: 'Alex', writable:false }) console.log(obj.someProp) // Alex obj.someProp = 'James' // Uncaught TypeError: Cannot assign to read only property 'someProp' of object #<Object>
'use strict'const notExtensableObj = {}Object.preventExtensions(notExtensableObj)notExtensableObj.someProp = 'Value'// Uncaught TypeError: Can't add property someProp, object is not extensible
'use strict' const notExtensableObj = {} Object.preventExtensions(notExtensableObj) notExtensableObj.someProp = 'Value' // Uncaught TypeError: Can't add property someProp, object is not extensible
Ошибка будет выброшена в строгом режиме и при попытке удаления поля из объекта, когда это сделать нельзя.
const obj = {}Object.defineProperty(obj, 'someProp', { value: 'Anna', configurable: false})delete obj.someProp// Uncaught TypeError: Cannot delete property 'someProp' of #<Object>
const obj = {} Object.defineProperty(obj, 'someProp', { value: 'Anna', configurable: false }) delete obj.someProp // Uncaught TypeError: Cannot delete property 'someProp' of #<Object>
Если запустить все примеры кода выше без строгого режима, они выполнятся без ошибок, но значения полей не изменятся.
Параметры функции не могут иметь одинаковые имена
СкопированоЕсли в функции объявить два параметра с одинаковым именем, то строгий режим выбросит ошибку выполнения.
'use strict'// Uncaught SyntaxError: Duplicate parameter name not allowed in this contextfunction sum(a, b, a) { // ...}
'use strict' // Uncaught SyntaxError: Duplicate parameter name not allowed in this context function sum(a, b, a) { // ... }
Без use strict
интерпретатор выполнит код без ошибок, но обратиться к переопределённому параметру будет невозможно.
function sum(a, b, a) { console.log(a) console.log(b)}sum(1, 2, 3) // Выведет 3 и 2, первый аргумент потерян навсегда
function sum(a, b, a) { console.log(a) console.log(b) } sum(1, 2, 3) // Выведет 3 и 2, первый аргумент потерян навсегда
Другое поведение this
СкопированоПри включённом строгом режиме this
больше не будет по умолчанию ссылаться на глобальный объект.
'use strict'function logThis() { console.log(this)}logThis()// Выведет undefined
'use strict' function logThis() { console.log(this) } logThis() // Выведет undefined
Без use strict
если вызывать функцию в глобальном контексте (например в консоли браузера), то this
всегда будет ссылаться на глобальный объект.
Запрещено использовать зарезервированные слова
СкопированоВ строгом режиме запрещено использовать в коде некоторые слова, которые были специально зарезервированы для того, чтобы использовать их в будущем. Это слова implements
, interface
, let
, package
, private
, protected
, public
, static
, yield
. Некоторые из этих слов уже используется в данный момент: например объявление переменных через let
или возвращение значения из генератора с помощью yield
.
Ограничение небезопасных конструкций
СкопированоДополнительно включение строгого режима не позволяет использовать в коде конструкцию with
и очищает переменные, созданные с помощью eval
. Обе эти конструкции устарели и являются потенциально опасными, потому не используются в современном JavaScript.
Как пишется
Скопировано'use strict'
называется директивой, так как это не просто строка, а специальная инструкция для интерпретатора. Потому очень важно поместить объявление строгого режима в самом начале скрипта, чтобы это была самая первая строчка, которая исполнится.
'use strict' // Включили строгий режим// Далее остальной код
'use strict' // Включили строгий режим // Далее остальной код
Если поместить строку ниже, то включение строгого режима не произойдёт.
console.log(1 + 2)// 3'use strict' // Просто объявление строки, строгий режим не включился// Код ниже работает без строгого режима
console.log(1 + 2) // 3 'use strict' // Просто объявление строки, строгий режим не включился // Код ниже работает без строгого режима
Над 'use strict'
можно размещать только комментарии.