"use strict";(перевод: «use strict») — директива, разрешающая выполнение кода в строгом режиме . Без этой директивы программа работает в неограниченном режиме .
Строгий режим был введен в ECMAScript 5, и старые браузеры ( IE9 и ниже ) его не поддерживают. То есть они его игнорируют и запускают все в неограниченном режиме.
Для чего он используется "use strict";?
В строгом режиме,
некоторые ошибки могут быть обнаружены раньше,
самые опасные или бесполезные части JavaScript запрещены или вызывают ошибку времени выполнения.
Как это используется "use strict";?
Чтобы включить строгий режим для всего скрипта, нужно в начале поставить директиву "use strict";или .'use strict';
"use strict";
// el código aquí se ejecuta en el modo estricto
Чтобы включить строгий режим в функции, вам нужно поместить директиву в начало функции.
// el código aquí se ejecuta en el modo irrestricto
function f() {
"use strict";
// el código aquí se ejecuta en el modo estricto
}
// el código aquí se ejecuta en el modo irrestricto
В чем разница между строгим режимом и неограниченным режимом?
В строгом режиме,
значение не может быть присвоено неопределенной переменной (spec §11.13.1 ). В неограниченном режиме создается глобальная переменная.
(function() {
"use strict";
x = 5; // ReferenceError: x is not defined
})();
x = 5; // crea la variable global x
Вы также не можете присвоить значение свойству, доступному только для чтения. В строгом режиме выдается ошибка, а в неограниченном режиме она просто игнорируется.
(function() {
"use strict";
window.undefined = 5; // TypeError: Cannot assign to read only
})(); // property 'undefined' of [object Object]
window.undefined = 5; // No hace nada
инструкция не может быть использованаwith ( см. §12.10 ).
(function() {
"use strict";
with(Object) {} // SyntaxError: Strict mode code may not include a with statement
})();
повторяющиеся свойства не могут быть определены для литерала объекта ( см. §§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 es igual a {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); // regresa 2
изменения объекта argumentsне меняют аргументы ( см. §§10.6 ).
function eval(arguments) { // SyntaxError: Unexpected eval or arguments in strict mode
"use strict";
eval = "5"; // SyntaxError: Unexpected eval or arguments in strict mode
++eval; // SyntaxError: Unexpected eval or arguments in strict mode
arguments++; // SyntaxError: Unexpected eval or arguments in strict mode
try {
var arguments = 5; // SyntaxError: Unexpected eval or arguments in strict mode
} catch(eval) {} // SyntaxError: Unexpected eval or arguments in strict mode
return arguments.eval;
}
function eval(arguments) {
eval = "5";
++eval;
arguments++;
try {
var arguments = 5;
} catch(eval) {}
return arguments.eval;
}
eval(); // regresa 5
argument.callery нельзя использоватьarguments.callee ( см. §13.2 ).
(function f() {
"use strict";
arguments.caller; // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
arguments.callee; // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
f.arguments; // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
})();
есть больше зарезервированных слов для будущих версий ECMAScript ( см. §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";
})(); // regresa "8?"
Использование use-strict добавляет в интерпретатор браузера способ выполнения кода javascript, это вынуждает вас объявлять переменные, прежде чем вы сможете их использовать, теперь их использование может варьироваться, если вы хотите, чтобы это влияло глобально , вы должны использовать его в начале кода, или, если вы хотите, чтобы он повлиял на функцию, вы могли бы использовать его после функции
function showData(){
var msj = "welcome";
alert(msj)
}
в этой функции браузер выполняет код без проблем. Но если мы добавим use-strict.
function showData(){
"use strict";
msj = "welcome";
alert(msj)
}
браузер выдаст ошибку за не объявление переменной раньше, чтобы ее использовать, для этого надо объявить переменную перед ее использованием.
function showData(){
"use strict";
var msj = "welcome";
alert(msj);
}
Этот и многие другие критерии являются частью строгого использования, например, определение свойства дважды, повторяющиеся параметры и т. д., проверьте ссылку и найдите примеры.
"use strict";
(перевод: «use strict») — директива, разрешающая выполнение кода в строгом режиме . Без этой директивы программа работает в неограниченном режиме .Строгий режим был введен в ECMAScript 5, и старые браузеры ( IE9 и ниже ) его не поддерживают. То есть они его игнорируют и запускают все в неограниченном режиме.
Для чего он используется
"use strict";
?В строгом режиме,
Как это используется
"use strict";
?Чтобы включить строгий режим для всего скрипта, нужно в начале поставить директиву
"use strict";
или .'use strict';
Чтобы включить строгий режим в функции, вам нужно поместить директиву в начало функции.
В чем разница между строгим режимом и неограниченным режимом?
В строгом режиме,
значение не может быть присвоено неопределенной переменной (spec §11.13.1 ). В неограниченном режиме создается глобальная переменная.
Вы также не можете присвоить значение свойству, доступному только для чтения. В строгом режиме выдается ошибка, а в неограниченном режиме она просто игнорируется.
инструкция не может быть использована
with
( см. §12.10 ).повторяющиеся свойства не могут быть определены для литерала объекта ( см. §§11.1.5 ).
повторяющиеся параметры не могут быть определены в функции (спецификация §§13.1 , §15.3.2 ).
изменения объекта
arguments
не меняют аргументы ( см. §§10.6 ).delete
выдает ошибку, если аргумент не является модифицируемым свойством объекта (спецификация §§11.4.1 ).eval
вы не можете создавать экземпляры переменных и функций вне их собственного контекста ( см. §10.4.2 ).this
не преобразуется в объект , и независимо от того, преобразуется лиthis
онundefined
вnull
глобальный объект (спецификация §§10.4.3 ).их нельзя использовать
eval
илиarguments
как имена (спецификация §11.4.4 , §11.4.5 , §11.13 , §12.2.1 , §12.10 , §12.14.1 , §13.1 ).argument.caller
y нельзя использоватьarguments.callee
( см. §13.2 ).есть больше зарезервированных слов для будущих версий ECMAScript ( см. §7.6.1.2 ).
нельзя использовать литералы в восьмеричном основании (спецификация B.1.1 , B.1.2 ).
Этот ответ является переводом моего ответа на этот же вопрос на русском сайте .
Использование use-strict добавляет в интерпретатор браузера способ выполнения кода javascript, это вынуждает вас объявлять переменные, прежде чем вы сможете их использовать, теперь их использование может варьироваться, если вы хотите, чтобы это влияло глобально , вы должны использовать его в начале кода, или, если вы хотите, чтобы он повлиял на функцию, вы могли бы использовать его после функции
в этой функции браузер выполняет код без проблем. Но если мы добавим use-strict.
браузер выдаст ошибку за не объявление переменной раньше, чтобы ее использовать, для этого надо объявить переменную перед ее использованием.
Этот и многие другие критерии являются частью строгого использования, например, определение свойства дважды, повторяющиеся параметры и т. д., проверьте ссылку и найдите примеры.