¿Qué hace el "uso estricto" en JavaScript y cuál es el razonamiento detrás de esto?
Recientemente, ejecuté parte de mi código JavaScript a través de JSLint de Crockford y me dio el siguiente error:
Problema en la línea 1, carácter 1: falta la declaración "usar estricto".
Al buscar un poco, me di cuenta de que algunas personas agregan contenido "use strict";
a su código JavaScript. Una vez que agregué la declaración, el error dejó de aparecer. Desafortunadamente, Google no reveló gran parte de la historia detrás de esta declaración en cadena. Ciertamente debe tener algo que ver con cómo el navegador interpreta JavaScript, pero no tengo idea de cuál sería el efecto.
Entonces, ¿de qué se "use strict";
trata, qué implica y sigue siendo relevante?
¿Alguno de los navegadores actuales responde a la "use strict";
cadena o es para uso futuro?
Actualización para módulos ES6
Dentro de los módulos ECMAScript nativos (con declaraciones import
y ) y las clases ES6 , el modo estricto siempre está habilitado y no se puede deshabilitar.export
Respuesta original
Este artículo sobre el modo estricto de Javascript puede interesarle: John Resig - Modo estricto de ECMAScript 5, JSON y más
Para citar algunas partes interesantes:
El modo estricto es una nueva característica de ECMAScript 5 que le permite colocar un programa o una función en un contexto operativo "estricto". Este contexto estricto impide que se realicen determinadas acciones y genera más excepciones.
Y:
El modo estricto ayuda de dos maneras:
- Detecta algunos errores de codificación comunes y genera excepciones.
- Previene o genera errores cuando se realizan acciones relativamente "inseguras" (como obtener acceso al objeto global).
- Deshabilita funciones que son confusas o mal pensadas.
También tenga en cuenta que puede aplicar el "modo estricto" a todo el archivo... O puede usarlo solo para una función específica (todavía citando el artículo de John Resig) :
// Non-strict code...
(function(){
"use strict";
// Define your library strictly...
})();
// Non-strict code...
Lo cual podría resultar útil si tienes que mezclar código antiguo y nuevo ;-)
Entonces, supongo que es un poco como lo que "use strict"
puedes usar en Perl (¿de ahí el nombre?) : te ayuda a cometer menos errores, al detectar más cosas que podrían provocar roturas.
El modo estricto ahora es compatible con todos los principales navegadores .
Es una nueva característica de ECMAScript 5. John Resig escribió un buen resumen al respecto.
Es solo una cadena que colocas en tus archivos JavaScript (ya sea en la parte superior de tu archivo o dentro de una función) que se ve así:
"use strict";
Ponerlo en su código ahora no debería causar ningún problema con los navegadores actuales, ya que es solo una cadena. Puede causar problemas con su código en el futuro si su código viola la pragma. Por ejemplo, si actualmente foo = "bar"
no lo has definido foo
primero, tu código comenzará a fallar... lo cual es algo bueno en mi opinión.
La declaración "use strict";
indica al navegador que utilice el modo estricto, que es un conjunto de funciones de JavaScript reducido y más seguro.
Lista de características (no exhaustiva)
No permite variables globales. (Detecta
var
declaraciones faltantes y errores tipográficos en nombres de variables)Las asignaciones fallidas silenciosas generarán un error en modo estricto (asignación
NaN = 5;
)Los intentos de eliminar propiedades no eliminables arrojarán (
delete Object.prototype
)Requiere que todos los nombres de propiedad en un objeto literal sean únicos (
var x = {x1: "1", x1: "2"}
)Los nombres de los parámetros de función deben ser únicos (
function sum (x, x) {...}
)Prohíbe la sintaxis octal (
var x = 023;
algunos desarrolladores suponen erróneamente que un cero precedente no hace nada para cambiar el número).Prohibe la
with
palabra claveeval
en modo estricto no introduce nuevas variablesProhíbe borrar nombres simples (
delete x;
)Prohíbe la vinculación o cesión de los nombres
eval
yarguments
en cualquier formaEl modo estricto no asigna un alias a las propiedades del
arguments
objeto con los parámetros formales. (por ejemplo, enfunction sum (a,b) { return arguments[0] + b;}
Esto funciona porquearguments[0]
está vinculado aa
, etc.) ( Consulteexamples
la sección siguiente para comprender la diferencia )arguments.callee
no es apoyado
[Ref: Modo estricto , Mozilla Developer Network ]
Ejemplos:
- El código en modo estricto no asigna alias a las propiedades de los objetos de argumentos creados dentro de él.
function show( msg ){
msg = 42;
console.log( msg ); // msg === 42
console.log( arguments[0] ); // arguments === 42
}
show( "Hey" );
// In strict mode arguments[i] does not track the value of
// the corresponding named argument, nor does a named argument track the value in the corresponding arguments[i]
function showStrict( msg ){
"use strict";
msg = 42;
console.log( msg ); // msg === 42
console.log( arguments[0] ); // arguments === "Hey"
}
showStrict( "Hey" );