Строгий режим был введен в ECMAScript 5 (ES5). Это семантически более строгая или ограниченная версия языка JavaScript, которая будет генерировать ошибки, если код не семантически правильный.
Например, в нестрогом режиме, если вы инициализируете переменную, не объявляя ее с помощью ключевого слова var
(например, x = 5;
), интерпретатор JavaScript будет считать, что вы ссылались на глобальную переменную, и если такой переменной не найдено, она создается автоматически. В строгом режиме вы получите ошибку.
Кроме того, устаревшие функции также могут генерировать ошибки в строгом режиме. Строгий режим уменьшает количество ошибок, повышает безопасность и общую производительность вашего приложения.
Включение строгого режима
Чтобы включить строгий режим, все, что вам нужно сделать, это просто добавить строку "use strict"
в начале вашего скрипта, как показано в следующем примере:
"use strict";
// Пишем код
x = 5; // ReferenceError: x is not defined
console.log(x);
Если вы добавите директиву "use strict"
в качестве первой строки вашей JavaScript-программы, строгий режим будет применяться ко всему скрипту. Но вы также можете включить строгий режим только внутри функции, например так:
x = 5;
console.log(x); // 5
function sayHello() {
"use strict";
str = "Hello World!"; // ReferenceError: str is not defined
console.log(str);
}
sayHello();
Директива "use strict"
распознается только в начале скрипта или функции. Все современные браузеры поддерживают директиву "use strict"
, кроме Internet Explorer 9 и более ранних версий. Браузеры, которые не поддерживают директиву "use strict"
игнорируют ее и анализируют JavaScript в нестрогом режиме.
Общие ограничения в строгом режиме
Строгий режим меняет как синтаксис, так и поведение во время выполнения. В следующих разделах мы рассмотрим общие ограничения, которые применяются в строгом режиме:
Необъявленные переменные не допускаются
Как вы уже знаете, в строгом режиме все переменные должны быть объявлены. Если вы присвоите значение идентификатору, который не является объявленной переменной, будет сгенерирована ошибка ReferenceError.
"use strict";
function doSomething() {
msg = "Hi, there!"; // ReferenceError: msg is not defined
return msg;
}
console.log(doSomething());
Не разрешено удаление переменной или функции
В строгом режиме, если вы попытаетесь удалить переменную или функцию, возникнет синтаксическая ошибка. В нестрогом режиме такая попытка завершается неудачей, и выражение удаления оценится как false
.
"use strict";
var person = {name: "Peter", age: 28};
delete person; // SyntaxError
Аналогично, при попытке удалить функцию в строгом режиме вы получите синтаксическую ошибку:
"use strict";
function sum(a, b) {
return a + b;
}
delete sum; // SyntaxError
Дублирование имени параметра не допускается
В строгом режиме генерируется синтаксическая ошибка, если объявление функции имеет два или более параметров с одинаковым именем. В нестрогом режиме ошибки не возникает.
"use strict";
function square(a, a) { // SyntaxError
return a * a;
}
console.log(square(2, 2));
В строгом режиме по соображениям безопасности код, передаваемый в eval()
, не может объявлять/изменять переменные или определять функции в окружающей области, как это может быть в нестрогом режиме.
"use strict";
eval("var x = 5;");
console.log(x); // ReferenceError: x is not defined
Eval и arguments не могут быть использованы в качестве идентификаторов
В строгом режиме имена eval
и arguments
обрабатываются как ключевые слова, поэтому их нельзя использовать в качестве имен переменных, имен функций или имен параметров функций.
"use strict";
var eval = 10; // SyntaxError
console.log(eval);
Не допускается оператор with
В строгом режиме оператор with
не допускается. Оператор with
добавляет свойства и методы объекта в текущую область. Таким образом, операторы, вложенные в оператор with
, могут вызывать свойства и методы объекта напрямую, без ссылки на него.
"use strict";
// Without with statement
var radius1 = 5;
var area1 = Math.PI * radius1 * radius1;
// Using with statement
var radius2 = 5;
with(Math) { // SyntaxError
var area2 = PI * radius2 * radius2;
}
Запись в свойство только для чтения не разрешена
В строгом режиме присвоение значения не доступному для записи свойству, свойству только для получения или несуществующему свойству вызовет ошибку. В нестрогом режиме эти попытки игнорируются.
"use strict";
var person = {name: "Peter", age: 28};
Object.defineProperty(person, "gender", {value: "male", writable: false});
person.gender = "female"; // TypeError
Добавление нового свойства в нерасширяемый объект недопустимо
В строгом режиме попытки создать новые свойства для нерасширяемых или несуществующих объектов также приведут к ошибке. Но в нестрогом режиме эти попытки игнорируются.
"use strict";
var person = {name: "Peter", age: 28};
console.log(Object.isExtensible(person)); // true
Object.freeze(person); // lock down the person object
console.log(Object.isExtensible(person)); // false
person.gender = "male"; // TypeError
Восьмеричные числа не допускаются
В строгом режиме восьмеричные числа (числа, начинающиеся с нуля, например, 010, 0377) не допускаются. Тем не менее, он поддерживается во всех браузерах в нестрогом режиме. В ES6 восьмеричные числа поддерживаются префиксом числа с 0o
, то есть 0o10, 0o377 и т. д.
"use strict";
var x = 010; // SyntaxError
console.log(parseInt(x));
В приведенных выше примерах ясно видно, как строгий режим может помочь вам избежать распространенных ошибок, которые часто остаются незамеченными при написании программ на JavaScript.
Использование зарезервированных ключевых слов не допускаются
Как вы уже знаете из предыдущих глав, зарезервированные слова не могут использоваться в качестве идентификатора (имена переменных, имена функций) в скриптах JavaScript. В дополнение к этому строгий режим также накладывает ограничения на использование тех ключевых слов, которые зарезервированы для будущего.
Согласно последним стандартам ECMAScript 6 (или ES6), эти ключевые слова являются зарезервированными ключевыми словами, когда они находятся в коде строгого режима: await
, implements
, interface
, package
, private
, protected
, public
, и static
. Для оптимальной совместимости вам в любом случае следует избегать использования зарезервированных ключевых слов в качестве имен переменных или имен функций в вашей программе.
Зарезервированные слова, которые также называют ключевыми словами, являются специальными словами, являющимися частью синтаксиса языка JavaScript, например, var
, if
, for
, function
и т. д. См. зарезервированные ключевые слова в JS для получения полного списка всех зарезервированных слов в JavaScript.