Поиск…
Синтаксис
- «использовать строгий»;
- «использовать строгую»;
- `использовать строгий`;
замечания
Строгий режим - это опция, добавленная в ECMAScript 5, чтобы включить несколько несовместимых друг с другом улучшений. Изменения поведения в коде «строгого режима» включают:
- Присвоение неопределенным переменным вызывает ошибку вместо определения новых глобальных переменных;
- Присвоение или удаление незаписываемых свойств (таких как
window.undefined
) вызывает ошибку вместоwindow.undefined
; - Устаревший восьмеричный синтаксис (например,
0777
) не поддерживается; - Оператор
with
не поддерживается; -
eval
не может создавать переменные в окружающем пространстве; - Функции
.caller
и.arguments
не поддерживаются; - Список параметров функции не может иметь дубликатов;
-
window
больше не используется автоматически в качестве значенияthis
.
ПРИМЕЧАНИЕ . - « Строгий » режим НЕ активируется по умолчанию, как если бы страница использовала JavaScript, который зависит от особенностей нестрогого режима, тогда этот код сломается. Таким образом, он должен быть включен самим программистом.
Для всех скриптов
Строгий режим может применяться на всех сценариях, помещая инструкцию "use strict";
перед любыми другими заявлениями.
"use strict";
// strict mode now applies for the rest of the script
Строгий режим включен только в сценариях, где вы определяете "use strict"
. Вы можете комбинировать сценарии с строгим режимом и без него, потому что строгое состояние не разделяется между разными сценариями.
Для функций
Строгий режим также может применяться к отдельным функциям, добавляя "use strict";
в начале объявления функции.
function strict() {
"use strict";
// strict mode now applies to the rest of this function
var innerFunction = function () {
// strict mode also applies here
};
}
function notStrict() {
// but not here
}
Строгий режим также применим к любым внутренним облачным функциям.
Изменения в глобальных свойствах
В области нестрогового режима, когда переменная назначается без инициализации с помощью ключевого слова var
, const
или let
, она автоматически объявляется в глобальной области:
a = 12;
console.log(a); // 12
Однако в строгом режиме любой доступ к необъявленной переменной вызовет ошибку ссылки:
"use strict";
a = 12; // ReferenceError: a is not defined
console.log(a);
Это полезно, потому что JavaScript имеет ряд возможных событий, которые иногда бывают неожиданными. В нестандартном режиме эти события часто заставляют разработчиков полагать, что они являются ошибками или неожиданным поведением, поэтому, если включить строгий режим, любые возникающие ошибки заставляют их точно знать, что делается.
"use strict";
// Assuming a global variable mistypedVariable exists
mistypedVaraible = 17; // this line throws a ReferenceError due to the
// misspelling of variable
Этот код в строгом режиме отображает один возможный сценарий: он выдает опорную ошибку, указывающую на номер строки присвоения, позволяя разработчику немедленно обнаружить тип ошибки в имени переменной.
В нестрогом режиме, помимо того, что ошибка не mistypedVaraible
и назначение успешно выполнено, mistypedVaraible
будет автоматически объявлен в глобальной области как глобальная переменная. Это означает, что разработчику необходимо вручную искать это задание в коде.
Кроме того, заставляя объявление переменных, разработчик не может случайно объявить глобальные переменные внутри функций. В нестрогом режиме:
function foo() {
a = "bar"; // variable is automatically declared in the global scope
}
foo();
console.log(a); // >> bar
В строгом режиме необходимо явно объявить переменную:
function strict_scope() {
"use strict";
var a = "bar"; // variable is local
}
strict_scope();
console.log(a); // >> "ReferenceError: a is not defined"
Эта переменная также может быть объявлена вне и после функции, что позволяет использовать ее, например, в глобальной области:
function strict_scope() {
"use strict";
a = "bar"; // variable is global
}
var a;
strict_scope();
console.log(a); // >> bar
Изменения свойств
Строгий режим также предотвращает удаление удаляемых свойств.
"use strict";
delete Object.prototype; // throws a TypeError
Вышеприведенный оператор просто игнорируется, если вы не используете строгий режим, однако теперь вы знаете, почему он не выполняется так, как ожидалось.
Это также препятствует расширению не расширяемого имущества.
var myObject = {name: "My Name"}
Object.preventExtensions(myObject);
function setAge() {
myObject.age = 25; // No errors
}
function setAge() {
"use strict";
myObject.age = 25; // TypeError: can't define property "age": Object is not extensible
}
Поведение списка аргументов функции
arguments
объекта ведут себя по-разному в строгом и нестандартном режиме. В нестрогом режиме объект argument
будет отражать изменения в значении параметров, которые присутствуют, однако в строгом режиме любые изменения значения параметра не будут отражаться в объекте argument
.
function add(a, b){
console.log(arguments[0], arguments[1]); // Prints : 1,2
a = 5, b = 10;
console.log(arguments[0], arguments[1]); // Prints : 5,10
}
add(1, 2);
Для приведенного выше кода объект arguments
изменяется при изменении значения параметров. Однако для строгого режима это не отразится.
function add(a, b) {
'use strict';
console.log(arguments[0], arguments[1]); // Prints : 1,2
a = 5, b = 10;
console.log(arguments[0], arguments[1]); // Prints : 1,2
}
Стоит отметить, что если какой-либо из параметров не undefined
, и мы пытаемся изменить значение параметра как в режиме строгого режима, так и в нестрочном режиме, объект arguments
остается неизменным.
Строгий режим
function add(a, b) {
'use strict';
console.log(arguments[0], arguments[1]); // undefined,undefined
// 1,undefined
a = 5, b = 10;
console.log(arguments[0], arguments[1]); // undefined,undefined
// 1, undefined
}
add();
// undefined,undefined
// undefined,undefined
add(1)
// 1, undefined
// 1, undefined
Нестрогий режим
function add(a,b) {
console.log(arguments[0],arguments[1]);
a = 5, b = 10;
console.log(arguments[0],arguments[1]);
}
add();
// undefined,undefined
// undefined,undefined
add(1);
// 1, undefined
// 5, undefined
Повторяющиеся параметры
Строгий режим не позволяет использовать повторяющиеся имена параметров функции.
function foo(bar, bar) {} // No error. bar is set to the final argument when called
"use strict";
function foo(bar, bar) {}; // SyntaxError: duplicate formal argument bar
Область функций в строгом режиме
В строгом режиме функции, объявленные в локальном блоке, недоступны вне блока.
"use strict";
{
f(); // 'hi'
function f() {console.log('hi');}
}
f(); // ReferenceError: f is not defined
Сфера применения, объявления функций в строгом режиме имеют тот же тип привязки, что и let
или const
.
Непростые списки параметров
function a(x = 5) {
"use strict";
}
является недопустимым JavaScript и будет SyntaxError
потому что вы не можете использовать директиву "use strict"
в функции с списком SyntaxError
параметров, например, выше - присваивание по умолчанию x = 5
Непростые параметры включают:
- Значение по умолчанию
function a(x = 1) {
"use strict";
}
- деструктурирующие
function a({ x }) {
"use strict";
}
- Параметры отдыха
function a(...args) {
"use strict";
}