JS
May 31

Строгий режим в JavaScript (use strict)

Долгое время JavaScript развивался без проблем с обратной совместимостью к прошлым версиям языка: добавлялись новые возможности, старая функциональность не изменялась.

В результате, существующий код продолжал работать, но каждая ошибка и несовершенство языка застревали в нем навсегда.

Так JavaScript работает по-умолчанию.

Что же выбрать?

Sloppy mode (небрежный режим)

Режим работы JavaScript по-умолчанию называется sloppy mode и у него есть свои плюсы и минусы:

Плюсы

  • Режим позволяет не обращать внимание на несоответствие кода спецификации JavaScript, например:
    • Можно использовать переменную до её объявления

Минусы

Strict mode (строгий режим)

В 2009 году появляется стандарт ECMAScript 5 (ES5).

Он добавляет новые возможности в язык и изменяет некоторые из существующих. Чтобы устаревший код в новых версиях языка продолжал работать стабильно и предсказуемо, в стандарт был введен строгий режим.

Строгий режим вводит в JavaScript ограничения и некоторые правила по написанию кода:

Правила

Значением this по умолчанию является undefined:

'use strict'

function showMeThis() {    
    return this
}

showMeThis() // undefined

Ограничения

Нельзя присваивать значения или обращаться к необъявленным переменным:

function returnY() {    
    'use strict'    
    y = 123    
    return y
}

returnY() 

// Uncaught ReferenceError: y is not defined

Нельзя присваивать значения глобальным переменным, доступным только для чтения или записи:

'use strict'

var NaN = NaN
var undefined = undefined
var Infinity = 'and beyond'

// Uncaught TypeError: Cannot assign to read only property 

Нельзя удалить «неудаляемое» свойство объекта:

'use strict'

const obj = {}

Object.defineProperties(obj, 'x', {
    value: 1
})

delete obj.x 

// Uncaught TypeError: Property description must be an object: x

Запрещено дублирование параметров:

'use strict'

function someFunc(a, b, b, c) { } 

// Uncaught SyntaxError: Duplicate parameter
// nname ot allowed in this context

Нельзя использовать зарезервированные слова:

abstract extends intertace synchronized boolean false long this break 
final native throw byte finally new throws case float null transient 
catch for package true char function private try class goto protected 
var const if public void continue implements return while default 
import short with do in static double instanceof super else int switch

Когда использовать строгий режим?

  • Защитить код от начинающих разработчиков
  • Когда нужно писать чистый и безопасный код