Кратко
Скопировано'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' можно размещать только комментарии.