¿Qué hace el "uso estricto" en JavaScript y cuál es el razonamiento detrás de esto?

Resuelto Mark Rogers asked hace 15 años • 32 respuestas

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?

Mark Rogers avatar Aug 26 '09 23:08 Mark Rogers
Aceptado

Actualización para módulos ES6

Dentro de los módulos ECMAScript nativos (con declaraciones importy ) 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 .

Pascal MARTIN avatar Aug 26 '2009 16:08 Pascal MARTIN

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 fooprimero, tu código comenzará a fallar... lo cual es algo bueno en mi opinión.

seth avatar Aug 26 '2009 16:08 seth

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)

  1. No permite variables globales. (Detecta vardeclaraciones faltantes y errores tipográficos en nombres de variables)

  2. Las asignaciones fallidas silenciosas generarán un error en modo estricto (asignación NaN = 5;)

  3. Los intentos de eliminar propiedades no eliminables arrojarán ( delete Object.prototype)

  4. Requiere que todos los nombres de propiedad en un objeto literal sean únicos ( var x = {x1: "1", x1: "2"})

  5. Los nombres de los parámetros de función deben ser únicos ( function sum (x, x) {...})

  6. 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).

  7. Prohibe la withpalabra clave

  8. evalen modo estricto no introduce nuevas variables

  9. Prohíbe borrar nombres simples ( delete x;)

  10. Prohíbe la vinculación o cesión de los nombres evaly argumentsen cualquier forma

  11. El modo estricto no asigna un alias a las propiedades del argumentsobjeto con los parámetros formales. (por ejemplo, en function sum (a,b) { return arguments[0] + b;}Esto funciona porque arguments[0]está vinculado a a, etc.) ( Consulte examplesla sección siguiente para comprender la diferencia )

  12. arguments.calleeno es apoyado

[Ref: Modo estricto , Mozilla Developer Network ]


Ejemplos:

  1. 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" );
gprasant avatar Nov 24 '2014 21:11 gprasant