Строгий режим (strict mode) в JavaScript
JavaScript

Строгий режим (strict mode) в JavaScript

Строгий режим (strict mode) — это особенность спецификации ECMAScript 5, позволяющая переключится в специальную, «ограниченную» версию JavaScript. Строгий режим накладывает ряд ограничений на языковые конструкции, тем самым исключая некоторые подводные камни и предотвращая ошибки. Также в строгом режиме выбрасывается больше исключений, как правило с более подробным описанием ошибки.

Включение strict mode

Включение strict mode осуществляется при помощи конструкции:


'use strict';

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


function inStrictMode() {
    'use strict';
    // ... your code ...
}

Обратите внимание, что для включения строго режима не добавлено каких-либо новых синтаксических конструкций. Строковая константа ‘use strict’ будет проигнорирована старыми браузерами, не поддерживающими строгий режим. Таким образом, вы можете использовать строгий режим, не беспокоясь о том, что в старых браузерах это вызовает ошибку.

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

При использовании use strict для всего скрипта нужно быть аккуратным с объединением файлов. При объединении скрипта в strict mode со скриптом в non-strict mode итоговый скрипт будет выполняться в строгом режиме. Это может вызвать некоторые ошибки, которые были не предусмотрены при написании второго скрипта. Поэтому рекомендуется код внутри каждого скрипта оборачивать анонимной функцией и для нее включать строгий режим.


// Non-strict code...
 
(function() {
    'use strict'; 
    // Define your library strictly...
})();
 
// Non-strict code...

Изменения в строгом режиме

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

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


'use strict';
unknownVariable = 17; // throws a ReferenceError

В строгом режиме в некоторых ситуациях, в которых в обычном режиме просто ничего не происходит, в строгом режиме бросаются исключения. Например, присваивание NaN в обычном режиме ничего не делает, присваивание не происходит, и разработчик не получает какой-либо информации об этом. В строгом режиме такое присваивание генерирует исключение. Аналогично любое другое присваивание, которое в обычном режиме «молча» не выполняется, в строгом режиме вызывает исключение.


'use strict';

// Изменение свойства, защищенного от записи
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Изменение свойства, имеющего только getter
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Добавление нового свойства объекту, защищенному от расширения
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'test'; // throws a TypeError

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


'use strict';
var o = { p: 1, p: 2 }; // !!! syntax error

Аналогично, параметры, передаваемые в функцию, также должны быть уникальны:


function sum(a, a, c) // !!! syntax error
{
  ...
}

Строгий режим запрещает использование конструкции with() {}. Проблема заключается в том, что переменная внутри этого блока может ссылаться как на свойство объекта, переданного в with, так и на локальную переменную или на свойство глобального объекта.

Еще одно отличие строго режима от нестрогого заключается в том, что в строгом режиме при передаче значения this в функцию c помощью call, apply или bind — это значение не оборачивается в объект. В нестрогом режиме, если в качестве this передается строка, число или логическое значение — оно оборачивается в соответствующий объект String, Number или Boolean. Если передается null или undefined — объектом this становится глобальный объект. В строгом режиме значение this передается «как есть»:


function test() { return this; }
console.log(test() === undefined);  // false
console.log(test.call(2) === 2);  // false
console.log(test.apply(null) === null);  // false
console.log(test.call(undefined) === undefined);  // false
console.log(test.bind(true)() === true);  // false

'use strict';
function test() { return this; }
console.log(test() === undefined);  // true
console.log(test.call(2) === 2);  // true
console.log(test.apply(null) === null);  // true
console.log(test.call(undefined) === undefined);  // true
console.log(test.bind(true)() === true);  // true

Заключение

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

Рассылка
Подпишитесь на рассылку и получайте дайджест новостей и статей.
Никакого спама!
Подписаться