Строгий режим JavaScript

Строгий режим - это функция ES5, и это способ улучшить работу JavaScript. И по-другому, поскольку включение строгого режима изменяет семантику языка JavaScript. Очень важно знать основные различия между кодом JavaScript в строгом режиме и обычным кодом JavaScript, который часто называют небрежным режимом.

Строгий режим - этоES5функция, и это способ заставить JavaScript вести себя влучший способ.

И впо-другому, поскольку включение строгого режима изменяет семантику языка JavaScript.

Очень важно знать основные различия между кодом JavaScript в строгом режиме и «нормальным» JavaScript, который часто называютнебрежный режим.

Строгий режим в основном удаляет функциональность, которая была возможна в ES3 и устарела с ES5 (но не удалена из-за требований обратной совместимости)

Как включить строгий режим

Строгий режим не обязателен. Как и в случае с каждым критическим изменением в JavaScript, мы не можем изменить поведение языка по умолчанию, потому что это нарушит работу множества JavaScript, а JavaScript прилагает много усилий, чтобы код JavaScript 1996 года работал и сегодня. Это ключ к успеху.

Итак, у нас есть'use strict'директиву, которую нам нужно использовать для включения строгого режима.

Вы можете поместить его в начало файла, чтобы применить его ко всему коду, содержащемуся в файле:

'use strict'

const name = ‘Flavio’ const hello = () => ‘hey’

//…

Вы также можете включить строгий режим для отдельной функции, поставив'use strict'в начале тела функции:

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'
})()

Variable not defined

Ошибки присвоения

JavaScript автоматически выдает некоторые ошибки преобразования.

В строгом режиме эти тихие ошибки теперь вызывают проблемы:

const undefined = 1(() => {
  'use strict'
  undefined = 1
})()

То же самое относится к Infinity, NaN,eval,argumentsи больше.

В 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 #<Object> which has only a getter
  }
)()

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

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
  }
)()

(видетьObject.preventExtensions())

Кроме того, небрежный режим позволяет без сбоев устанавливать свойства для примитивных значений, но при этом вообще ничего не делать:

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, а в строгом режиме вызывает TypeError:

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

Обратите внимание, что стрелочные функции всегда вызываютSyntaxErrorв этом случае:

((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

Удаленныйwith

Строгий режим отключаетwithключевое слово, чтобы удалить некоторые крайние случаи и обеспечить дополнительную оптимизацию на уровне компилятора.

Скачать мою бесплатнуюРуководство для начинающих по JavaScript


Больше руководств по js: