Директива "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" распознается только в начале скрипта или функции.