Нередко встречается код со строкой "use strict";. Например, библиотеки часто начинаются с этого:
(function () {
"use strict";
Что значит "use strict", и зачем его использовать?
На других языках: English • Español
Ответы
Ответ 1
"use strict"; (перевод: «использовать строгий») - это установка, которая заставляе
код обрабатываться в строгом режиме. Без этой установки код обрабатывается в неограниченно
режиме.
Строгий режим был введён в ECMAScript 5, и старые браузеры (IE9 и младше) его н
поддерживают. То есть, не обращают внимания на установку по умолчанию и всё обрабатываетс
в неограниченном режиме.
Зачем использовать "use strict";?
В строгом режиме:
некоторые ошибки можно найти быстрее,
более опасные и не полезные черты JavaScript либо запрещены, либо приводят к ошибке.
Как использовать "use strict";?
Чтобы включить строгий режим в целом скрипте, надо поставить установку "use strict"
или 'use strict'; в начало скрипта.
"use strict";
// код здесь обрабатывается в строгом режиме
Чтобы включить строгий режим в функции, надо поставить установку в начало кода функции.
// код здесь обрабатывается в неограниченном режиме
function f() {
"use strict";
// код здесь обрабатывается в строгом режиме
}
// код здесь обрабатывается в неограниченном режиме
В чём различие между строгим режимом и неограниченным режимом?
В строгом режиме:
нельзя присваивать значение в неопределённую переменную (спецификация §11.13.1)
В неограниченном режиме создается глобальная переменная.
(function() {
"use strict";
x = 5; // ReferenceError: x is not defined
})();
x = 5; // Создает глобальную переменную x
Также нельзя присваивать значение в свойство данных только для чтения.
(function() {
"use strict";
window.undefined = 5; // TypeError: Cannot assign to read only
})(); // property 'undefined' of [object Object]
window.undefined = 5; // Ничего не делает
нельзя использовать инструкцию with (спецификация §12.10).
(function() {
"use strict";
with(Object) {} // SyntaxError: Strict mode code may not include a with statement
})();
в ES5 нельзя определить повторные свойства в литерале объекта (спецификация §11.1.5).
(function() {
"use strict";
var x = {
a: 1,
a: 2
}; // SyntaxError: Duplicate data property in object literal
})(); // not allowed in strict mode
var x = {
a: 1,
a: 2
}; // x равно {a: 2}
нельзя определить повторные формальные параметры функции (спецификация §13.1, §15.3.2).
function f(a, a) {
"use strict";
} // SyntaxError: Strict mode function may not have duplicate parameter names
function f(a, a) {
return a;
}
f(1,2); // возвращает 2
изменения объекта arguments не изменяют аргументы (спецификация §10.6).
function f(x) {
"use strict";
arguments[0] = 5;
return x;
}
f(10); // возвращает 10
function f(x) {
arguments[0] = 5;
return x;
}
f(10); // возвращает 5
delete приводит к ошибке, если аргумент - не изменяемое свойство объекта (спецификаци
§11.4.1).
(function f(x) {
"use strict";
var y = 4;
delete f; // SyntaxError: Delete of an unqualified identifier in strict mode.
delete x; // SyntaxError: Delete of an unqualified identifier in strict mode.
delete y; // SyntaxError: Delete of an unqualified identifier in strict mode.
delete window.undefined; // TypeError: Cannot delete property
})(); // 'undefined' of [object Object]
(function f(x) {
var y = 4;
delete f; // Возвращает false
delete x; // Возвращает false
delete y; // Возвращает false
delete window.undefined; // Возвращает false
})();
eval не может инстанциировать переменные и функции в контексте вызова (спецификаци
§10.4.2).
(function () {
"use strict";
eval("var x = 5");
return x; // ReferenceError: x is not defined
})();
(function () {
eval("var x = 5");
return x;
})(); // Возвращает 5
this не преобразуется в объект, а если значение this - undefined или null, то н
преобразуется в глобальный объект (спецификация §10.4.3).
function f() {
"use strict";
return this;
};
f.call(4); // возвращает 4
f.call(null); // возвращает null
f.call(undefined); // возвращает undefined
function f() {
return this;
};
f.call(4); // возвращает [object Number]
f.call(null); // возвращает [object global]
f.call(undefined); // возвращает [object global]
eval и arguments - нельзя изменить или использовать в качестве имени (спецификаци
§11.4.4, §11.4.5, §11.13, §12.2.1, §12.10, §12.14.1, §13.1).
function eval(arguments) { // SyntaxError: Unexpected eval or arguments in stric
mode
"use strict";
eval = "5"; // SyntaxError: Unexpected eval or arguments in stric
mode
++eval; // SyntaxError: Unexpected eval or arguments in stric
mode
arguments++; // SyntaxError: Unexpected eval or arguments in stric
mode
try {
var arguments = 5; // SyntaxError: Unexpected eval or arguments in stric
mode
} catch(eval) {} // SyntaxError: Unexpected eval or arguments in stric
mode
return arguments.eval;
}
function eval(arguments) {
eval = "5";
++eval;
arguments++;
try {
var arguments = 5;
} catch(eval) {}
return arguments.eval;
}
eval(); // возвращает 5
нельзя использовать argument.caller и arguments.callee (спецификация §13.2).
(function f() {
"use strict";
arguments.caller; // TypeError: 'caller', 'callee', and 'arguments' propertie
may not be accessed on strict mode functions or the arguments objects for calls to them
arguments.callee; // TypeError: 'caller', 'callee', and 'arguments' propertie
may not be accessed on strict mode functions or the arguments objects for calls to them
f.arguments; // TypeError: 'caller', 'callee', and 'arguments' propertie
may not be accessed on strict mode functions or the arguments objects for calls to them
})();
больше слов, зарезервированных для использования в будущем (спецификация §7.6.1.2).
(function () {
"use strict";
var implements, let, private, public, yield, interface, package, protected, static;
})(); // SyntaxError: Unexpected strict mode reserved word
нельзя использовать литералы восьмеричной СС (спецификация B.1.1, B.1.2).
(function () {
"use strict";
return 010 + // SyntaxError: Octal literals are not allowed in strict mode.
"\077"; // SyntaxError: Octal literals are not allowed in strict mode.
})();
(function () {
return 010 + "\077";
})(); // возвращает "8?"
Ответ 2
Если в двух словах то 'use strict' этим ты указываешь что используешь ES6 (ECMAScript6)
самый последний стандарт JavaScript, который отличается синтаксисом от предыдущего (ES5).
Комментариев нет:
Отправить комментарий