Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

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

Ранние версии JavaScript прощали многие ошибки: опечатка в имени переменной молча создавала новую переменную, неудачная запись в свойство просто игнорировалась. Чтобы не ломать старые сайты, это поведение оставили, но добавили строгий режим (strict mode) — вариант языка, в котором такие ошибки становятся настоящими ошибками.

Включение строгого режима

Строгий режим включает строка 'use strict'; в самом начале файла или функции. Это не команда, а директива — указание для движка JavaScript:

'use strict';
 
console.log('Строгий режим включён'); // Строгий режим включён

В примерах этого урока директива стоит первой строкой, поэтому действует на весь пример.

Опечатки в именах

Без строгого режима присваивание необъявленной переменной создаёт новую глобальную переменную. Опечатка проходит незамеченной:

let count = 0;
conut = 5;
 
console.log(count); // 0

В строгом режиме та же опечатка сразу вызывает ошибку ReferenceError:

'use strict';
 
let total = 0;
 
try {
  totl = 10;
} catch (error) {
  console.log(error.name); // ReferenceError
}

this в обычной функции

В обычном режиме функция, вызванная без объекта, получает в this глобальный объект — и может случайно что-то в нём испортить. В строгом режиме this равен undefined:

'use strict';
 
function whoAmI() {
  return this;
}
 
console.log(whoAmI()); // undefined

Запись в защищённые свойства

Запись в замороженный объект или в свойство, доступное только для чтения, обычно молча игнорируется. Строгий режим сообщает о ней ошибкой:

'use strict';
 
const config = Object.freeze({ currency: '€' });
 
try {
  config.currency = '$';
} catch (error) {
  console.log(error.name); // TypeError
}

Запрещённый синтаксис

Некоторые устаревшие конструкции в строгом режиме запрещены совсем, и код с ними даже не запустится — будет SyntaxError. Например, одинаковые имена параметров:

'use strict';
 
function sum(a, a) {
  return a + a;
}

Также запрещены конструкция with и числа с ведущим нулём вроде 010.

Где строгий режим включён сам

Писать директиву нужно не всегда. Код модулей (файлов с import и export) и тела классов всегда работают в строгом режиме:

class Counter {
  reset() {
    try {
      resetValue = 0;
    } catch (error) {
      console.log(error.name);
    }
  }
}
 
new Counter().reset(); // ReferenceError

В современных проектах почти весь код — модули, поэтому строгий режим там включён по умолчанию.

Частая ошибка

Поставить 'use strict' не в начало. Директива работает, только если стоит первой инструкцией файла или функции, иначе это просто строка, которая ничего не делает:

console.log('Старт'); // Старт
'use strict';
 
function whoAmI() {
  return this === undefined;
}
 
console.log(whoAmI()); // false

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.