use strict

Дополнительные (и строгие!) проверки кода.

Время чтения: 5 мин

Кратко

Секция статьи "Кратко"

'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.defineProperty() или Object.preventExtensions() в 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' можно размещать только комментарии.