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

Директива "use strict"; указывает, что код JavaScript должен выполняться в "строгом режиме".

Директива "use strict" была добавлена в JavaScript 1.8.5 (ECMAScript версии 5).

Это не оператор, а константное выражение, которое игнорируется более ранними версиями JavaScript.

Цель директивы "use strict" — указать, что код должен выполняться в, так называемом, "строгом режиме".

В строгом режиме вы не можете, например, использовать не декларированные переменные.

Строгий режим поддерживается в:

  • IE с версии 10,
  • Firefox с версии 4,
  • Chrome с версии 13,
  • Safari с версии 5.1,
  • Opera с версии 12.

Декларирование строгого режима

Строгий режим декларируется путем добавления директивы "use strict"; в начало скрипта или функции.

Если директива указана в начале скрипта, то она имеет глобальный эффект (весь код скрипта выполняется в строгом режиме):


"use strict";
x = 3.14;       // Ошибка, так как переменная x не декларирована

myFunction();

function myFunction() {
     y = 3.14;   // Ошибка, так как переменная y не декларирована
}

Если директива указана внутри функции, то она имеет локальный эффект (только код внутри функции выполняется в строгом режиме):


x = 3.14;       // Ошибки не будет
myFunction();

function  myFunction() {
   "use strict";
     y = 3.14;   // Возникнет ошибка
}

Синтаксис директивы "use strict";

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

Компилирование числовых (4 + 5;) или строковых ("John Doe";) констант в программе JavaScript не имеет побочных эффектов. Они просто компилируются в несуществующую переменную и умирают.

Таким образом, строковая константа "use strict"; срабатывает только в новых компиляторах, которые "понимают" ее значение.

Зачем нужен строгий режим?

Благодаря строгому режиму проще писать "безопасный" JavaScript код.

В строгом режиме ранее вполне приемлемый "плохой синтаксис" превращается в реальные ошибки.

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

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

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

Ограничения в строгом режиме

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


"use strict";
x = 3.14;                // Это приведет к ошибке

Внимание! Объекты тоже переменные.

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


"use strict";
x = {p1:10, p2:20};      // Это приведет к ошибке

Нельзя удалять переменную (или объект):


"use strict";
var x = 3.14;
delete x;                // Это приведет к ошибке

Нельзя удалять функцию:


"use strict";
function x(p1, p2) {}; 
delete x;                // Это приведет к ошибке

Одинаковые имена параметров запрещены:


"use strict";
function x(p1, p1) {};   // Это приведет к ошибке

Восьмеричные числовые константы запрещены:


"use strict";
var x = 010;             // Это приведет к ошибке

Восьмеричные экранированные символы запрещены:


"use strict";
var x = "\010";            // Это приведет к ошибке

Запись в свойства, предназначенные только для чтения, запрещено:


"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});

obj.x = 3.14;            // Это приведет к ошибке

Запись в свойства, предназначенные только для возврата значения, запрещено:


"use strict";
var obj = {get x() {return 0} };

obj.x = 3.14;            // Это приведет к ошибке

Нельзя удалять неудаляемые свойства:


"use strict";
delete Object.prototype; // Это приведет к ошибке

Нельзя использовать строку "eval" в качестве имени переменной:


"use strict";
var eval = 3.14;         // Это приведет к ошибке

Нельзя использовать строку "arguments" в качестве имени переменной:


"use strict";
var arguments = 3.14;    // Это приведет к ошибке

Нельзя использовать выражение with:


"use strict";
with (Math){x = cos(2)}; // Это приведет к ошибке

По соображениям безопасности, функции eval() запрещено создавать переменные в области видимости, где она была вызвана:


"use strict";
eval ("var x = 2");
alert (x);               // Это приведет к ошибке

В вызовах функций как f(), значением this был глобальный объект. В строгом режиме оно undefined.

Задел на будущее

В строгом режиме нельзя использовать будущие зарезервированные слова. Это implements, interface, let, package, private, protected, public, static, yield.


"use strict";
var public = 1500;      // Это приведет к ошибке

ВНИМАНИЕ!
Директива "use strict" распознается только в начале скрипта или функции.