Кратко
Секция статьи "Кратко""use strict"
включает строгий режим выполнения JavaScript. Эта строка должна располагаться в самом начале скрипта, иначе строгий режим не будет работать. В строгом режиме интерпретатор будет явно выбрасывать ошибки на действия, которые ранее пропускал. Если строгий режим был включён, то отключить его для файла уже нельзя.
Пример
Секция статьи "Пример""use strict"; // Располагаем строку в самом начале файла!let name = 'Alex'// ... другой код
"use strict"; // Располагаем строку в самом начале файла! let name = 'Alex' // ... другой код
Как это понять
Секция статьи "Как это понять"Строгий режим был введён в JavaScript со стандартом ECMAScript 5 в 2009 году.
Этот стандарт добавил много нового в язык, но чтобы старые браузеры могли продолжать работать, был введён специальный строгий режим выполнения, который включал новые функции языка.
Строгий режим делает следующее:
- Выбрасывает ошибки, когда в коде используются некоторые небезопасные конструкции.
- Выключает функции языка, которые запутывают код и потому не должны использоваться.
- Предотвращает использование слов, которые могут быть использованы в качестве ключевых в будущем.
Давайте подробнее посмотрим некоторые важные ограничения, которые накладывает включение строгого режима.
Нельзя использовать переменные без объявления
Секция статьи "Нельзя использовать переменные без объявления"Интерпретатор в строгом режиме выбросит ошибку, если обратиться к переменной без её объявления:
"use strict";var name = "Anna";console.log(name); // Annaage = 24;console.log(age); // Uncaught ReferenceError: age is not defined
"use strict"; var 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"При включённом строгом режиме 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"
можно размещать только комментарии.