Рубрики
Без рубрики

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

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

Строгий режим – это функция 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 # 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
  }
)()

(см. раздел Объект.Предотвращение расширений())

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

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/”