A veces veo código que incluye "use strict";
. Por ejemplo, muchas bibliotecas comienzan con esto:
(function () {
"use strict";
¿Qué significa "use strict" y para qué se usa?
A veces veo código que incluye "use strict";
. Por ejemplo, muchas bibliotecas comienzan con esto:
(function () {
"use strict";
¿Qué significa "use strict" y para qué se usa?
"use strict";
(traducción: «usar estricto») es una directiva que activa la ejecución de código en el modo estricto. Sin esta directiva, el programa se ejecuta en el modo irrestricto.
El modo estricto se introdujo en ECMAScript 5, y navegadores viejos (IE9 y menos) no lo soportan. Es decir, lo ignoran y ejecutan todo en el modo irrestricto.
"use strict";
?En el modo estricto,
"use strict";
?Para activar el modo estricto para todo el script, es necesario poner la directiva "use strict";
o 'use strict';
al comienzo.
"use strict";
// el código aquí se ejecuta en el modo estricto
Para activar el modo estricto en una función, es necesario poner la directiva al comienzo de la función.
// 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
En el modo estricto,
no se puede asignar un valor a una variable no definida (especificación §11.13.1). En el modo irrestricto se crea una variable global.
(function() {
"use strict";
x = 5; // ReferenceError: x is not defined
})();
x = 5; // crea la variable global x
Tampoco se puede asignar un valor a una propriedad de sólo lectura. En el modo estricto se lanza un error, y en el modo irrestricto está ignorada silenciosamente.
(function() {
"use strict";
window.undefined = 5; // TypeError: Cannot assign to read only
})(); // property 'undefined' of [object Object]
window.undefined = 5; // No hace nada
no se puede usar la instrucción with
(especificación §12.10).
(function() {
"use strict";
with(Object) {} // SyntaxError: Strict mode code may not include a with statement
})();
no se pueden definir propriedades duplicadas en un literal de objeto (especificación §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}
no se pueden definir parametros duplicados en una función (especificación §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
cambios al objeto arguments
no cambian los argumentos (especificación §10.6).
function f(x) {
"use strict";
arguments[0] = 5;
return x;
}
f(10); // regresa 10
function f(x) {
arguments[0] = 5;
return x;
}
f(10); // regresa 5
delete
lanza un error si el argumento no es una propriedad modificable de un objeto (especificación §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; // regresa false
delete x; // regresa false
delete y; // regresa false
delete window.undefined; // regresa false
})();
eval
no puede instanciar variables y funciones fuera de su proprio contexto (especificación §10.4.2).
(function () {
"use strict";
eval("var x = 5");
return x; // ReferenceError: x is not defined
})();
(function () {
eval("var x = 5");
return x;
})(); // regresa 5
this
no se convierte en un objeto, y si this
es undefined
o null
no se convierte en el objeto global (especificación §10.4.3).
function f() {
"use strict";
return this;
};
f.call(4); // regresa 4
f.call(null); // regresa null
f.call(undefined); // regresa undefined
function f() {
return this;
};
f.call(4); // regresa [object Number]
f.call(null); // regresa [object global]
f.call(undefined); // regresa [object global]
no se pueden usar eval
o arguments
como nombres (especificación §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 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
no se puede usar argument.caller
y arguments.callee
(especificación §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
})();
hay más palabras reservadas para futuras versiones de ECMAScript (especificación §7.6.1.2).
(function () {
"use strict";
var implements, let, private, public, yield, interface, package, protected, static;
})(); // SyntaxError: Unexpected strict mode reserved word
no se pueden usar literales en base octal (especificación 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?"
Esta respuesta es una traducción de mi respuesta a la misma pregunta en el sitio ruso.
El uso de use-stric, añade al interprete del navegador como ejecutar el código javascript, esto te obliga a que necesitas declarar las variables antes de poder usarlas, ahora el uso de ellas puede variar, si quieres que afecte global mente, debes usarlo al inicio del código, o si quieres que afecta a una funcion podrías usarlo a continuación de la función
function showData(){
var msj = "welcome";
alert(msj)
}
en esta función el navegador ejecuta el código sin problema alguno. Pero si adicionamos use-strict.
function showData(){
"use strict";
msj = "welcome";
alert(msj)
}
el navegador lanzara un error por no declarar antes la variable, para poder usarla, para ello deberás declarar la variable antes de usarla.
function showData(){
"use strict";
var msj = "welcome";
alert(msj);
}
Esta y muchos criterios hacen parte del use-strict, por ejemplo definir una propiedad dos veces, parámetros duplicados etc, revisa la referencia y encontrás ejemplos