use declaración la falta ¿Qué hace "uso estricto" en JavaScript, y cuál es el razonamiento detrás de esto?



12 Answers

Es una nueva característica de ECMAScript 5. John Resig escribió un buen resumen de este.

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 el pragma. Por ejemplo, si actualmente tiene foo = "bar" sin definir primero foo , su código empezará a fallar ... lo cual, en mi opinión, es bueno.

use strict javascript español

Recientemente, ejecuté parte de mi código JavaScript a través de JSLint de Crockford, y dio el siguiente error:

Problema en la línea 1 carácter 1: Falta una declaración de "uso estricto".

Haciendo algunas búsquedas, me di cuenta de que algunas personas añaden "use strict"; en su código de 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 de cadena. Ciertamente, debe tener algo que ver con la forma en que el navegador interpreta el JavaScript, pero no tengo idea de cuál sería el efecto.

Entonces, ¿qué es "use strict"; En general, ¿qué implica, y sigue siendo relevante?

¿Alguno de los navegadores actuales responde al "use strict"; cadena o es para uso futuro?




Si a la gente le preocupa el use strict , vale la pena leer este artículo:

Compatibilidad con el 'modo estricto' de ECMAScript 5 en los navegadores. ¿Qué significa esto?
NovoGeek.com - El weblog de Krishna

Habla sobre el soporte del navegador, pero lo más importante es cómo manejarlo de manera segura:

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/



Usando 'use strict'; de repente no mejora tu código.

El modo estricto de JavaScript es una característica en ECMAScript 5 . Puede habilitar el modo estricto declarando esto en la parte superior de su script / función.

'use strict';

Cuando un motor de JavaScript ve esta directiva , comenzará a interpretar el código en un modo especial. En este modo, se generan errores cuando se detectan ciertas prácticas de codificación que podrían terminar siendo errores potenciales (que es el razonamiento detrás del modo estricto).

Considera este ejemplo:

var a = 365;
var b = 030;

En su obsesión por alinear los literales numéricos, el desarrollador ha inicializado inadvertidamente la variable b con un octal literal. El modo no estricto interpretará esto como un literal numérico con valor 24 (en base 10). Sin embargo, el modo estricto arrojará un error.

Para obtener una lista no exhaustiva de especialidades en modo estricto, consulte esta respuesta .

¿Dónde debo usar 'use strict'; ?

  • En mi nueva aplicación de JavaScript: ¡Absolutamente! El modo estricto se puede usar como denunciante cuando estás haciendo algo estúpido con tu código.

  • En mi código JavaScript existente : ¡ Probablemente no! Si su código JavaScript existente tiene declaraciones que están prohibidas en modo estricto, la aplicación simplemente se romperá. Si desea un modo estricto, debe estar preparado para depurar y corregir su código existente. Es por esto que usar 'use strict'; de repente no mejora tu código .

¿Cómo uso el modo estricto?

  1. Insertar un 'use strict'; declaración en la parte superior de su guión:

    // File: myscript.js
    
    'use strict';
    var a = 2;
    ....
    

    Tenga en cuenta que todo en el archivo myscript.js se interpretará en modo estricto.

  2. O, inserte un 'use strict'; declaración en la parte superior de su función de cuerpo:

    function doSomething() {
        'use strict';
        ...
    }
    

    Todo en el ámbito léxico de la función doSomething se interpretará en modo estricto. La palabra ámbito léxico es importante aquí. Vea esta respuesta para una mejor explicación.

¿Qué cosas están prohibidas en modo estricto?

Encontré un buen artículo que describe varias cosas que están prohibidas en modo estricto (tenga en cuenta que esta no es una lista exclusiva):

Alcance

Históricamente, JavaScript se ha confundido acerca de cómo se ajustan las funciones de las funciones. A veces, parecen tener un alcance estático, pero algunas características hacen que se comporten como si estuvieran con un alcance dinámico. Esto es confuso, haciendo que los programas sean difíciles de leer y entender. El malentendido causa errores. También es un problema para el rendimiento. El alcance estático permitiría que la vinculación variable ocurra en el momento de la compilación, pero el requisito de alcance dinámico significa que la vinculación debe aplazarse hasta el tiempo de ejecución, lo que conlleva una penalización de rendimiento significativa.

El modo estricto requiere que todas las variables se realicen de forma estática. Eso significa que las características que anteriormente requerían el enlace dinámico deben eliminarse o modificarse. Específicamente, se elimina la instrucción with, y la capacidad de la función eval para manipular el entorno de su interlocutor está severamente restringida.

Uno de los beneficios del código estricto es que las herramientas como YUI Compressor pueden hacer un mejor trabajo al procesarlo.

Variables globales implícitas

JavaScript ha implicado variables globales. Si no declara explícitamente una variable, una variable global se declara implícitamente para usted. Esto facilita la programación para los principiantes, ya que pueden descuidar algunas de sus tareas básicas de limpieza. Pero hace que la administración de programas más grandes sea mucho más difícil y degrada significativamente la confiabilidad. Entonces, en modo estricto, las variables globales implícitas ya no se crean. Debes declarar explícitamente todas tus variables.

Fuga global

Hay una serie de situaciones que podrían hacer que this se vincule al objeto global. Por ejemplo, si olvida proporcionar el new prefijo al llamar a una función de constructor, el constructor estará vinculado de forma inesperada al objeto global, por lo que en lugar de inicializar un nuevo objeto, estará manipulando silenciosamente las variables globales. En estas situaciones, el modo estricto en cambio enlazará this con undefined , lo que hará que el constructor emita una excepción, permitiendo que el error se detecte mucho antes.

Falla ruidosa

JavaScript siempre ha tenido propiedades de solo lectura, pero no pudo crearlas usted mismo hasta que la función Object.createProperty de ES5 expusiera esa capacidad. Si intentara asignar un valor a una propiedad de solo lectura, fallaría en silencio. La asignación no cambiaría el valor de la propiedad, pero su programa procederá como si lo hubiera hecho. Este es un peligro para la integridad que puede hacer que los programas pasen a un estado inconsistente. En modo estricto, intentar cambiar una propiedad de solo lectura generará una excepción.

Octal

La representación de números en octal (o base 8) fue extremadamente útil al realizar la programación a nivel de máquina en máquinas cuyo tamaño de palabra era un múltiplo de 3. Necesitaba octal cuando trabajaba con el mainframe CDC 6600, que tenía un tamaño de palabra de 60 bits. Si pudieras leer octal, podrías ver una palabra como 20 dígitos. Dos dígitos representaron el código de operación y un dígito identificó uno de los 8 registros. Durante la lenta transición de los códigos de máquina a los lenguajes de alto nivel, se pensó que era útil proporcionar formas octales en los lenguajes de programación.

En C, se seleccionó una representación extremadamente desafortunada de la octalidad: Cero inicial. Entonces, en C, 0100 significa 64, no 100, y 08 es un error, no 8. Incluso más desafortunadamente, este anacronismo se ha copiado en casi todos los idiomas modernos, incluido JavaScript, donde solo se utiliza para crear errores. No tiene otro propósito. Así que en modo estricto, las formas octales ya no están permitidas.

Etcétera

Los argumentos pseudo array se vuelven un poco más parecidos a array en ES5. En modo estricto, pierde sus propiedades de caller y caller . Esto hace posible pasar sus arguments a un código no confiable sin renunciar a una gran cantidad de contexto confidencial. Además, se elimina la propiedad de arguments de funciones.

En modo estricto, las claves duplicadas en un literal de función producirán un error de sintaxis. Una función no puede tener dos parámetros con el mismo nombre. Una función no puede tener una variable con el mismo nombre que uno de sus parámetros. Una función no puede delete sus propias variables. Un intento de delete una propiedad no configurable ahora lanza una excepción. Los valores primitivos no están envueltos implícitamente.

Palabras reservadas para futuras versiones de JavaScript

ECMAScript 5 agrega una lista de palabras reservadas. Si los utiliza como variables o argumentos, el modo estricto generará un error. Las palabras reservadas son:

implements , interface , let , package , private , protected , public , static , y yield

Otras lecturas




Me gustaría ofrecer una respuesta algo más fundamentada que complemente las otras respuestas. Esperaba editar la respuesta más popular, pero fracasé. Traté de hacerlo lo más completo y completo posible.

Puede consultar la documentación de MDN para obtener más información.

"use strict" una directiva introducida en ECMAScript 5.

Las directivas son similares a las declaraciones, pero diferentes.

  • use strict no contiene palabras clave: la directiva es una declaración de expresión simple, que consiste en un literal de cadena especial (entre comillas simples o dobles). Los motores de JavaScript, que no implementan ECMAScript 5, simplemente ven una declaración de expresión sin efectos secundarios. Se espera que las versiones futuras de los estándares ECMAScript introduzcan el use como una palabra clave real; las citas se volverían obsoletas.
  • use strict se puede usar al principio de un script o de una función, es decir, debe preceder a cualquier otra declaración (real). No tiene que ser la primera instrucción en una secuencia de comandos de función: puede ir precedida por otras expresiones de instrucción que consisten en cadenas literales (y las implementaciones de JavaScript pueden tratarlas como directivas específicas de implementación). Las declaraciones literales de cadena, que siguen a una primera declaración real (en un script o función) son declaraciones de expresión simple. Los intérpretes no deben interpretarlos como directivas y no tienen ningún efecto.

La directiva de use strict indica que el siguiente código (en un script o una función) es un código estricto. El código en el nivel más alto de un script (código que no está en una función) se considera código estricto cuando el script contiene una directiva de use strict . El contenido de una función se considera código estricto cuando la función se define en un código estricto o cuando la función contiene una directiva de use strict . El código que se pasa a un método eval() se considera código estricto cuando se llamó a eval() desde un código estricto o contiene la directiva de use strict .

El modo estricto de ECMAScript 5 es un subconjunto restringido del lenguaje JavaScript, que elimina los déficits relevantes del lenguaje y presenta una comprobación de errores más estricta y una mayor seguridad. A continuación se enumeran las diferencias entre el modo estricto y el modo normal (de los cuales los tres primeros son particularmente importantes):

  • No se puede usar la sentencia -st en modo estricto.
  • En modo estricto, todas las variables deben declararse: si asigna un valor a un identificador que no se ha declarado como variable, función, parámetro de función, parámetro de cláusula catch o propiedad del Object global, obtendrá un ReferenceError . En el modo normal, el identificador se declara implícitamente como una variable global (como una propiedad del Object global)
  • En modo estricto, la palabra clave tiene el valor undefined en funciones que se invocaron como funciones (no como métodos). (En el modo normal, this siempre apunta al Object global). Esta diferencia se puede usar para probar si una implementación admite el modo estricto:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • Además, cuando se invoca una función con call() o se apply en modo estricto, this es exactamente el valor del primer argumento de la call() o apply() . (En el modo normal, null y undefined se reemplazan por el Object global y los valores, que no son objetos, se convierten en objetos).

  • En modo estricto obtendrá un TypeError , cuando intente asignar propiedades de solo lectura o definir nuevas propiedades para un objeto no extensible. (En el modo normal, ambos simplemente fallan sin mensaje de error).

  • En el modo estricto, al pasar el código a eval() , no puede declarar o definir variables o funciones en el alcance de la persona que llama (como puede hacerlo en el modo normal). En su lugar, se crea un nuevo ámbito para eval() y las variables y funciones están dentro de ese ámbito. Ese alcance se destruye después de que eval() finalice la ejecución.
  • En modo estricto, el objeto-argumentos de una función contiene una copia estática de los valores, que se pasan a esa función. En el modo normal, el objeto-argumentos tiene un comportamiento algo "mágico": los elementos de la matriz y los parámetros de la función nombrados hacen referencia al mismo valor.
  • En modo estricto, obtendrá un SyntaxError cuando el operador de delete va seguido de un identificador no calificado (una variable, función o parámetro de función). En el modo normal, la expresión de delete no haría nada y se evalúa como false .
  • En modo estricto obtendrá un TypeError cuando intente eliminar una propiedad no configurable. (En el modo normal, el intento simplemente falla y la expresión de delete se evalúa como false ).
  • En modo estricto, se considera un error sintáctico cuando intenta definir varias propiedades con el mismo nombre para un objeto literal. (En el modo normal no hay error.)
  • En modo estricto, se considera un error sintáctico cuando una declaración de función tiene múltiples parámetros con el mismo nombre. (En el modo normal no hay error.)
  • En modo estricto, los literales octales no están permitidos (son literales que comienzan con 0x . (En el modo normal, algunas implementaciones permiten los literales octales).
  • En modo estricto, los identificadores eval y los arguments se tratan como palabras clave. No puede cambiar su valor, no puede asignarles un valor y no puede usarlos como nombres para variables, funciones, parámetros de función o identificadores de un bloque catch.
  • En modo estricto hay más restricciones sobre las posibilidades de examinar la pila de llamadas. arguments.caller y arguments.callee causan un TypeError en una función en modo estricto. Además, algunas propiedades de llamadas y argumentos de las funciones en modo estricto causan un TypeError cuando intenta leerlas.



Si utiliza un navegador lanzado en el último año o más, entonces es muy probable que admita el modo estricto de JavaScript. Solo los navegadores antiguos antes de que ECMAScript 5 se convirtiera en el estándar actual no lo admiten.

Las citas en torno al comando aseguran que el código también funcionará en los navegadores más antiguos (aunque las cosas que generan un error de sintaxis en el modo estricto generalmente causarán que el script funcione mal de alguna manera difícil de detectar en esos navegadores antiguos).




Al agregar "use strict"; , los siguientes casos lanzarán un SyntaxError antes de que se ejecute el script:

  • Allanando el camino para futuras versiones de ECMAScript , utilizando una de las palabras clave recién reservadas (en previsión para ECMAScript 6 ): implements , interface , let , package , private , protected , public , static , y yield .

  • Declarando la función en bloques.

    if(a<b){ function f(){} }
    
  • Sintaxis octal

    var n = 023;
    
  • this apunta al objeto global.

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
    
  • Declarar dos veces el mismo nombre para un nombre de propiedad en un objeto literal

     {a: 1, b: 3, a: 7} 
    

    Este ya no es el caso en ECMAScript 6 ( error 1041128 ).

  • Declarando dos argumentos de función con la misma función de nombre

    f(a, b, b){}
    
  • Establecer un valor para una variable no declarada

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
    
  • Usando delete en un nombre de variable delete myVariable;

  • Usando eval o arguments como variable o función nombre de argumento

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 
    

Fuentes:




Incluir use strictal comienzo de todos sus archivos JavaScript sensibles desde este punto es una pequeña forma de ser un mejor programador de JavaScript y evitar que las variables aleatorias se vuelvan globales y las cosas cambien en silencio.




Algunas personas que formaron parte del comité de ECMAScript hablan bien: Cambios en JavaScript, Parte 1: ECMAScript 5 " sobre cómo el uso incremental del "use strict"conmutador permite a los implementadores de JavaScript limpiar muchas de las características peligrosas de JavaScript sin romper repentinamente todos los sitios web en el mundo.

Por supuesto, también habla de lo que muchos de esos errores son (eran) y de cómo ECMAScript 5 los corrige.




Tenga en cuenta que use strictse introdujo en EcmaScript 5 y se mantuvo desde entonces.

A continuación se presentan las condiciones para activar el modo estricto en ES6 y ES7 :

  • El código global es código de modo estricto si comienza con un Prólogo Directivo que contiene una Directiva de Uso Estricto (ver 14.1.1).
  • El código del módulo es siempre código de modo estricto.
  • Todas las partes de una ClassDeclaration o una ClassExpression son códigos de modo estricto.
  • El código de evaluación es un código de modo estricto si comienza con un Prólogo Directivo que contiene una Directiva de uso estricto o si la llamada a eval es una evaluación directa (ver 12.3.4.1) que está contenida en el código de modo estricto.
  • El código de función es código de modo estricto si la función FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition o ArrowFunction está incluida en el código de modo estricto o si el código que produce el valor de la función [[ECMAScriptCode]] comienza con un Prólogo Directivo que contiene una directiva de uso estricto.
  • El código de función que se suministra como los argumentos a los constructores incorporados de Función y Generador es un código de modo estricto si el último argumento es una Cadena que cuando se procesa es un FunctionBody que comienza con un Prólogo Directivo que contiene una Directiva de Uso Estricto.



Las principales razones por las que los desarrolladores deben usar "use strict"son:

  1. Previene la declaración accidental de variables globales . El uso "use strict()"asegurará que las variables se declaren varantes del uso. P.ej:

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
    
  2. NB: la "use strict"directiva solo se reconoce al comienzo de un script o una función.
  3. La cadena "arguments"no se puede utilizar como una variable:

    "use strict";
    var arguments = 3.14;    // This will cause an error
    
  4. Se restringirán los usos de palabras clave como variables. Tratar de usarlos arrojará errores.

En resumen, hará que su código sea menos propenso a errores y, a su vez, lo hará escribir un buen código.

Para leer más al respecto puedes consultar aquí .




"uso estricto"; Es el esfuerzo de ECMA para hacer que JavaScript sea un poco más robusto. Trae a JS un intento de hacerlo al menos un poco "estricto" (otros lenguajes implementan reglas estrictas desde los años 90). En realidad, "obliga" a los desarrolladores de JavaScript a seguir algún tipo de buenas prácticas de codificación. Aún así, JavaScript es muy frágil. No hay variables tipificadas, métodos mecanografiados, etc. Recomiendo a los desarrolladores de JavaScript que aprendan un lenguaje más sólido como Java o ActionScript3, e implementen las mismas prácticas recomendadas en su código JavaScript. depurar.




Normalmente, el script java no sigue reglas estrictas, por lo tanto aumenta las posibilidades de errores. Después de usar "use strict", el código del script java debe seguir un conjunto estricto de reglas como en otros lenguajes de programación, como el uso de terminadores, la declaración antes de la inicialización, etc.

Si "use strict"se utiliza, el código debe escribirse siguiendo un estricto conjunto de reglas, lo que reduce las posibilidades de errores y ambigüedades.




Related