Строгий режим – это функция ES5 , и это способ заставить JavaScript вести себя лучше .
И по-другому , так как включение строгого режима изменяет семантику языка JavaScript.
Действительно важно знать основные различия между кодом JavaScript в строгом режиме и “обычным” JavaScript, который часто называют небрежный режим .
Строгий режим в основном удаляет функциональность, которая была возможна в ES3 и устарела с ES5 (но не удалена из-за требований обратной совместимости)
Как включить Строгий режим
Строгий режим является необязательным. Как и при каждом критическом изменении в JavaScript, мы не можем изменить поведение языка по умолчанию, потому что это нарушило бы работу миллионов JavaScript, а JavaScript прилагает много усилий, чтобы убедиться, что код JavaScript 1996 года все еще работает сегодня. Это ключ к его успеху.
Итак, у нас есть директива "использовать строгий" , которую нам нужно использовать для включения строгого режима.
Вы можете поместить его в начало файла, чтобы применить его ко всему коду, содержащемуся в файле:
'use strict' const name = 'Flavio' const hello = () => 'hey' //...
Вы также можете включить строгий режим для отдельной функции, поставив "использовать строгий" в начале тела функции:
function hello() {
'use strict'
return 'hey'
}Это полезно при работе с устаревшим кодом, когда у вас нет времени на тестирование или уверенности, чтобы включить строгий режим для всего файла.
Что меняется в строгом режиме
Случайные глобальные переменные
Если вы присваиваете значение необъявленной переменной, JavaScript по умолчанию создает эту переменную в глобальном объекте:
;(function() {
variable = 'hey'
})()(() => {
name = 'Flavio'
})()
variable //'hey'
name //'Flavio'
При включении строгого режима возникает ошибка, если вы попытаетесь сделать то, что мы сделали выше:
;(function() {
'use strict'
variable = 'hey'
})()(() => {
'use strict'
myname = 'Flavio'
})()Ошибки назначения
JavaScript молча выдает некоторые ошибки преобразования.
В строгом режиме эти молчащие ошибки теперь вызывают проблемы:
const undefined = 1(() => {
'use strict'
undefined = 1
})()То же самое относится и к бесконечности, NaN, eval , аргументы и многое другое.
В JavaScript вы можете определить свойство объекта, недоступное для записи, с помощью
const car = {}
Object.defineProperty(car, 'color', { value: 'blue', writable: false })В строгом режиме вы не можете переопределить это значение, в то время как в небрежном режиме это возможно:
То же самое работает и для добытчиков:
const car = {
get color() {
return 'blue'
}
}
car.color = 'red'(
//ok
() => {
'use strict'
car.color = 'yellow' //TypeError: Cannot set property color of #Небрежный режим позволяет расширять нерасширяемый объект:
const car = { color: 'blue' }
Object.preventExtensions(car)
car.model = 'Fiesta'(
//ok
() => {
'use strict'
car.owner = 'Flavio' //TypeError: Cannot add property owner, object is not extensible
}
)()(см. раздел Объект.Предотвращение расширений())
Кроме того, небрежный режим позволяет устанавливать свойства на примитивные значения без сбоев, но и вообще ничего не делая:
true.false = ''( //'' 1 ).name = 'xxx' //'xxx' var test = 'test' //undefined test.testing = true //true test.testing //undefined
Строгий режим не работает во всех этих случаях:
;(() => {
'use strict'
true.false = ''(
//TypeError: Cannot create property 'false' on boolean 'true'
1
).name =
'xxx' //TypeError: Cannot create property 'name' on number '1'
'test'.testing = true //TypeError: Cannot create property 'testing' on string 'test'
})()Ошибки удаления
В небрежном режиме при попытке удалить свойство, которое вы не можете удалить, JavaScript возвращает значение false, в то время как в строгом режиме он вызывает ошибку типа:
delete Object.prototype(
//false
() => {
'use strict'
delete Object.prototype //TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
}
)()Аргументы функции с тем же именем
В обычных функциях у вас могут быть повторяющиеся имена параметров:
(function(a, a, b) {
console.log(a, b)
})(1, 2, 3)
//2 3
(function(a, a, b) {
'use strict'
console.log(a, b)
})(1, 2, 3)
//Uncaught SyntaxError: Duplicate parameter name not allowed in this context
Обратите внимание, что функции со стрелками всегда вызывают синтаксическую ошибку в этом случае:
((a, a, b) => {
console.log(a, b)
})(1, 2, 3)
//Uncaught SyntaxError: Duplicate parameter name not allowed in this context
Восьмеричный синтаксис
Восьмеричный синтаксис в строгом режиме отключен. По умолчанию, добавляя 0 для числа, совместимого с восьмеричным числовым форматом, оно (иногда сбивающее с толку) интерпретируется как восьмеричное число:
(() => {
console.log(010)
})()
//8
(() => {
'use strict'
console.log(010)
})()
//Uncaught SyntaxError: Octal literals are not allowed in strict mode.
Вы все еще можете включить восьмеричные числа в строгом режиме, используя синтаксис 0oXX :
;(() => {
'use strict'
console.log(0o10)
})()
//8
Удален с помощью
Строгий режим отключает ключевое слово с , чтобы удалить некоторые крайние случаи и обеспечить большую оптимизацию на уровне компилятора.
Оригинал: “https://flaviocopes.com/javascript-strict-mode/”