Строгий режим в JavaScript (use strict)
Долгое время JavaScript развивался без проблем с обратной совместимостью к прошлым версиям языка: добавлялись новые возможности, старая функциональность не изменялась.
В результате, существующий код продолжал работать, но каждая ошибка и несовершенство языка застревали в нем навсегда.
Так JavaScript работает по-умолчанию.
Sloppy mode (небрежный режим)
Режим работы JavaScript по-умолчанию называется sloppy mode
и у него есть свои плюсы и минусы:
Плюсы
Минусы
- В коде появляется магия, например, с преобразованием типов
- Код становится менее безопасным
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