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

pregunta creada en Mon, Jan 23, 2017 12:00 AM

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".

Al hacer algunas búsquedas, me di cuenta de que algunas personas agregan "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 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, ¿de qué se trata "use strict";, qué implica, y sigue siendo relevante?

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

    
7164
26 Respuestas                              26                         

Este artículo sobre el Modo estricto de Javascript podría interesarte: John Resig - Modo estricto ECMAScript 5, JSON y más

Para citar algunas partes interesantes:

  

El Modo estricto es una nueva función en ECMAScript 5 que le permite colocar un programa o una función en un contexto operativo "estricto". Este contexto estricto evita que se tomen ciertas acciones y produce más excepciones.

Y:

  

El modo estricto ayuda de dos maneras:

     
  • Captura algunos errores de codificación comunes, lanzando excepciones.
  •   
  • Previene o lanza errores, cuando se toman acciones relativamente "inseguras" (como obtener acceso al objeto global).
  •   
  • Deshabilita las 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 (aún citando el artículo de John Resig) :

 
// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code... 

Lo que podría ser útil si tiene que mezclar código antiguo y nuevo ;-)

Entonces, supongo que es un poco como el "use strict" que 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 admitido por todos los navegadores principales . Si está escribiendo su JavaScript en módulos nativos de ECMAScript (con las declaraciones import y export), entonces estrictamente el modo siempre está habilitado y no se puede deshabilitar.

    
4703
2019-04-24 20: 14: 27Z
  1. ¿Cambiar el valor predeterminado después de tantos años? Demasiado tarde para eso: rompería tantos sitios /scripts /aplicaciones existentes ... Lo único posible es ayudar a mejorar las cosas, para el futuro.
    2010-03-04 21: 54: 49Z
  2. Probé un pequeño fragmento de código que no sería válido al usar "use strict" en Firefox 3.6, Safari 5, Chrome 7 y Opera 10.6 (todos Mac). No hay errores de ningún tipo, por lo que supongo que el "uso estricto" todavía no es compatible con ningún navegador. Aunque no probé en IE9;)
    2010-11-10 09: 54: 12Z
  3. Actualización rápida: Firefox 4 tiene soporte completo para el modo estricto, y por lo que puedo decir, ningún otro navegador lo tiene. Safari y Chrome tienen soporte "parcial", pero realmente no sé lo que eso significa.
    2011-02-08 02: 02: 24Z
  4. Chrome 11 parece pasar todas estas pruebas al igual que IE10 ie.microsoft.com/testdrive/HTML5/TryStrict/Default.html#
    2011-05-13 17: 27: 29Z
  5. @ Julius: esto no se pudo haber implementado usando una palabra clave reservada, porque el código que intenta activar el modo estricto se interrumpiría en los navegadores antiguos. Agregar un literal de cadena "aleatorio" no rompe nada.
    2014-03-05 11: 22: 51Z

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

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 tu 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.

    
1187
2014-10-26 10: 31: 59Z
  1. Fallo rápido y falla ruidosamente.
    2013-01-29 22: 20: 19Z
  2. Si está escribiendo Javascript en línea en los archivos HTML, comience cada nuevo bloque con <script>"use strict";. La bandera solo se aplica al bloque en el que está incluido.
    2013-10-05 18: 50: 13Z
  3. Es gracioso, esto dio como resultado que las cadenas deben tener comillas simples. Así que escribe 'use strict'; en su lugar
    2015-01-30 08: 49: 17Z
  4. entonces, ¿qué pasaría con el concepto de elevación de javascript?
    2015-05-14 08: 33: 16Z
  5. @ SunilSharma Si intenta levantar, pero falla porque la variable no está definida, en el momento en que la agregará al objeto global. Con "use strict";, fallará en su lugar. Esto tiene más sentido, porque si lo agrega al objeto global, eso significa que podría no funcionar la próxima vez que ejecute la función /haga otra cosa que restablezca el bloque, ya que estará en el bloque más alto (global).
    2017-02-16 21: 15: 04Z

    La declaración "use strict"; le indica al navegador que use 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. (Coge las declaraciones var y los errores tipográficos en los nombres de las variables)

    2. Las asignaciones fallidas silenciosas arrojarán un error en modo estricto (asignando NaN = 5;)

    3. Los intentos de eliminar las propiedades que no se pueden recuperar se lanzarán (delete Object.prototype)

    4. Requiere que todos los nombres de propiedades 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. Anula la sintaxis octal (var x = 023; algunos desarrolladores asumen erróneamente que un cero anterior no hace nada para cambiar el número).

    7. Prohíbe la palabra clave with

    8. eval en modo estricto no introduce nuevas variables

    9. Prohibido eliminar nombres sin formato (delete x;)

    10. Prohibe el enlace o la asignación de los nombres eval y arguments en cualquier forma

    11. El modo estricto no crea alias propiedades del objeto arguments con los parámetros formales. (es decir, en function sum (a,b) { return arguments[0] + b;} Esto funciona porque arguments[0] está vinculado a a y así sucesivamente.)

    12. arguments.callee no es compatible

    [Ref: Modo estricto , Red de desarrolladores de Mozilla ]

        
    602
    2016-01-22 18: 30: 33Z
    1. Nit: las variables globales están permitidas, solo tienen que ser explícitas (por ejemplo, window.foo = bar).
      2016-06-20 09: 41: 03Z
    2. Requiere que todos los nombres de propiedad en un objeto literal sean únicos (var x = {x1: "1", x1: "2"}) es válido
      2017-07-29 08: 26: 18Z
    3. A su ejemplo en 11 le falta una modificación de a (de lo contrario no tiene sentido). I. e. suma de funciones (a, b) {a = 0; devuelve argumentos [0] + b; } alert (suma (1, 2)) devolverá 3 con modo estricto y 2 sin modo estricto, debido al aliasing.
      2018-03-14 11: 04: 03Z

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

    ECMAScript 5 'Modo estricto' compatible con 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.
    */
    
        
    392
    2018-01-22 11: 13: 12Z
    1. No estoy de acuerdo. Creo que esto demuestra por qué es muy útil. En esencia, significa que esto devuelve su función y no el window
      2013-02-26 15: 25: 21Z
    2. ¿cuándo quieres la ventana con this a la que no puedes apuntar con window?
      2013-07-18 08: 34: 07Z
    3. Se refiere a sí mismo. this pertenece a su propia función y no a la ventana global
      2013-07-28 21: 17: 28Z
    4. En el segundo this, uno es en realidad undefined.
      2013-08-14 11: 40: 32Z
    5. El punto es que su programa JS comenzará a fallar debido al acceso a una propiedad de un indefinido, en lugar de hacer silenciosamente algo incorrecto en el objeto global. Facilita el rastreo de errores sutiles.
      2015-07-31 05: 47: 55Z

    Unas palabras de precaución, todos los programadores que están recargando: ¡aplicar "use strict" al código existente puede ser peligroso! Esto no es una calcomanía que se sienta bien, que pueda pegar en el código para que sea "mejor". Con el pragma "use strict", el navegador de repente lanzará excepciones en lugares aleatorios que nunca lanzó antes solo porque en ese lugar estás haciendo algo que el JavaScript predeterminado /suelto permite felizmente, pero el JavaScript estricto aborrece. Es posible que haya infracciones estrictas que se ocultan en llamadas de uso poco frecuente en su código que solo generarán una excepción cuando finalmente se ejecuten, por ejemplo, en el entorno de producción que usan sus clientes que pagan.

    Si va a dar el paso, es una buena idea aplicar "use strict" junto con pruebas de unidad completas y una tarea de compilación JSHint estrictamente configurada que le dará cierta confianza de que no hay una esquina oscura de su módulo que explotará horriblemente solo porque has activado el modo estricto. O bien, aquí hay otra opción: simplemente no agregue "use strict" a ninguno de sus códigos heredados, probablemente sea más seguro de esa manera, honestamente. DEFINITIVAMENTE NO agregue "use strict" a los módulos que no posee o mantiene, como los módulos de terceros.

    Creo que aunque es un animal mortal enjaulado, "use strict" puede ser una buena cosa, pero tienes que hacerlo bien. El mejor momento para ser estricto es cuando su proyecto es greenfield y usted comienza desde cero. Configure el JSHint/JSLint con todas las advertencias y opciones ajustadas tan fuerte como su equipo pueda aguantar, obtenga un buen sistema de compilación /prueba /afirmación de todos los gustose Grunt+Karma+Chai, y solo LUEGO comience a marcar todos sus nuevos módulos como "use strict". Esté preparado para curar muchos errores y advertencias molestos. Asegúrate de que todos comprendan la gravedad configurando la compilación en FAIL si JSHint/JSLint produce alguna infracción.

    Mi proyecto no era un proyecto greenfield cuando adopté "use strict". Como resultado, mi IDE está lleno de marcas rojas porque no tengo "use strict" en la mitad de mis módulos, y JSHint se queja de eso. Es un recordatorio para mí sobre qué refactorización debo hacer en el futuro. Mi objetivo es estar libre de marcas rojas debido a todas mis declaraciones "use strict" faltantes, pero eso es en años.

        
    198
    2016-10-16 09: 10: 15Z
    1. ¿POR QUÉ los desarrolladores en este hilo son tan cautos sobre el "uso estricto"? ¡TIENE EXCEPCIONES en JavaScript que funciona de otra manera , por el amor de Dios! Solo espolvoréelo en el código como azúcar en los copos de maíz, ¿eh? ¡NO! ¡MALO! El "uso estricto" se debe usar con precaución, preferiblemente solo en el código que usted controla que tiene pruebas unitarias que pasan contra todos los navegadores principales y que ejercitan todas las rutas de código. ¿Tienes pruebas? Está bien, "usar estricto" está bien para ustedes, no esperen.
      2014-05-08 08: 38: 54Z
    2. Sí. Obviamente, el "uso estricto" puede romper un javascript aparentemente válido que no se ha roto antes. Pero el código que no se haya roto antes no es igual a que el código sea correcto y haga lo que se supone que debe hacer. Por lo general, hacer referencia a variables no declaradas indica un error tipográfico, etc. El uso estricto le permite detectar este tipo de errores y, con suerte, antes de enviar el código de producción.
      2015-03-09 07: 46: 42Z
    3. ... o simplemente aplique "use strict" como parte de una última pasada sobre su código, corrija todos los problemas obvios, encogiéndose de hombros, diga "good enough", luego sacarlo para producción :)
      2015-11-10 08: 49: 11Z
    4. Personalmente, nunca /muy rara vez agrego "use strict"; al código existente. Dicho esto, casi siempre lo usaré cuando esté escribiendo un nuevo código desde cero
      2016-03-25 20: 48: 41Z
    5. Sin embargo, si ya está utilizando JSLint, es probable que haya arreglado la mayoría de los lugares donde "usar estricto" rompería las cosas.
      2017-12-04 15: 22: 23Z

    El uso de 'use strict'; no mejora repentinamente tu código.

    El modo estricto de JavaScript es una característica de 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 literal octal. El modo no estricto interpretará esto como un literal numérico con el valor 24 (en la 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 puede usarse como denunciante cuando estás haciendo algo estúpido con tu código.

    • En mi existente Código JavaScript: ¡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'; norepentinamente mejora tu código .


    ¿Cómo uso el modo estricto?

    1. Inserta una declaración 'use strict'; en la parte superior de tu script:

       
      // 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 una declaración 'use strict'; sobre el cuerpo de su función:

       
      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í. Consulte esta respuesta para obtener una mejor explicación.


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

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

      

    Ámbito de aplicación

         

    Históricamente, JavaScript se ha confundido acerca de cómo funciona   se encuentran al alcance A veces parecen tener un alcance estático, pero algunos   las características hacen que se comporten como si estuvieran en un ámbito 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 se produjera una unión variable en la compilación   tiempo, pero el requisito de alcance dinámico significa que el enlace debe ser   aplazado hasta el tiempo de ejecución, que viene con un rendimiento significativo   penalización.

         

    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   Debe ser eliminado o modificado. Específicamente, la sentencia with es   eliminado, y la capacidad de la función eval para manipular el   El entorno de su interlocutor está severamente restringido.

         

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

         

    Variables globales implícitas

         

    JavaScript tiene variables globales implícitas. Si   no declara explícitamente una variable, una variable global es   declarado implícitamente para usted. Esto facilita la programación para   Los principiantes porque pueden descuidar parte de su limpieza básica.   quehaceres. Pero hace mucho más la gestión de programas más grandes.   Difícil y degrada significativamente la fiabilidad. Tan en estricto   Modo, ya no se crean variables globales implícitas. Debieras   declare explícitamente todas sus variables.

         

    Fugas globales

         

    Hay una serie de situaciones que podrían causar this   para ser atado al objeto global. Por ejemplo, si te olvidas de   proporcione el prefijo new al llamar a una función constructora, el   El this del constructor se enlazará inesperadamente al objeto global, por lo que   en lugar de inicializar un nuevo objeto, será silencioso   manipulación de variables globales. En estas situaciones, el modo estricto   en su lugar, enlace this a undefined, lo que hará que el constructor   lanzar una excepción en su lugar, permitiendo que el error sea detectado mucho   antes.

         

    Fallo ruidoso

         

    JavaScript siempre ha tenido propiedades de solo lectura, pero usted   No pudiste crearlos tú mismo hasta el Object.createProperty de ES5   La función expone esa capacidad. Si intentas asignar un valor   a una propiedad de solo lectura, fallaría silenciosamente. La tarea sería   no cambia el valor de la propiedad, pero su programa procederá como   aunque tenía Este es un peligro para la integridad que puede causar que los programas   entrar en un estado inconsistente En modo estricto, intentando cambiar un   la propiedad de solo lectura lanzará una excepción.

         

    Octal

         

    La representación octal (o base 8) de los números era extremadamente   Es útil cuando se realiza programación a nivel de máquina en máquinas cuya palabra   los tamaños eran múltiplos de 3. Necesitabas octal cuando trabajabas con CDC   6600 mainframe, que tenía un tamaño de palabra de 60 bits. Si pudieras leer   octal, puedes ver una palabra como 20 dígitos. Dos dígitos representados   el código de operación y un dígito identificaron uno de los 8 registros. Durante el   transición lenta de códigos de máquina a lenguajes de alto nivel, fue   Se cree que es útil para proporcionar formas octales en lenguajes de programación.

         

    En C, una representación extremadamente desafortunada de octalness era   seleccionado: cero inicial. Así que en C, 0100 significa 64, no 100, y 08 es una   error, no 8. Aún más desafortunadamente, este anacronismo ha sido   copiado en casi todos los idiomas modernos, incluido JavaScript, donde   Sólo se utiliza para crear errores. No tiene otro propósito. Así que en   Modo estricto, ya no se permiten formas octales.

         

    Et cetera

         

    Los argumentos pseudo array se vuelven un poco más   como una matriz en ES5. En modo estricto, pierde sus callee y caller.   propiedades Esto hace posible pasar su arguments a no confiable   Código sin renunciar a un montón de contexto confidencial. También el    Se elimina la propiedad 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 una de sus funciones.   parámetros Una función no puede delete sus propias variables. Un intento de    delete una propiedad no configurable ahora lanza una excepción. Primitivo   los valores 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


    Lecturas adicionales

    151
    2017-05-23 12: 02: 50Z
    1. es una muy buena explicación. Sin embargo, tengo una duda de que puedo usar el modo "estricto" junto con otras bibliotecas de scripts java, como Angular js?
      2016-08-05 03: 39: 33Z
    2. @ UVM: la directiva de modo estricto solo afecta el ámbito léxico. es decir, solo el archivo /función que se declara. Si tiene otro archivo /función que no tiene la directiva 'use strict', se ejecutarán en modo no estricto, incluso cuando se los llame desde una función que se ejecute en modo estricto. Consulte esta pregunta para obtener una explicación.
      2016-08-05 04: 11: 33Z
    3. Esto no es del todo correcto. 'use strict' cambia la forma en que se ejecuta el código.
      2016-10-22 19: 04: 31Z
    4. En el segundo vistazo, tienes razón. Pensé que quería decir que solo se lanzaron excepciones, pero no cambió la forma en que funcionaba el código (como cambiar this). Ahora veo que te referías a llamar a otras funciones.
      2016-10-23 03: 55: 08Z
    5. Hay algunos casos en que el octal es útil. La sintaxis de C es horrible, pero me hubiera gustado que los idiomas agregaran una nueva sintaxis octal que permitiría que la forma de cero inicial quedase obsoleta. Por supuesto, el hecho de que Javascript haya admitido la forma de cero inicial era simplemente tonto.
      2017-02-09 21: 08: 22Z

    Recomiendo encarecidamente a todos los desarrolladores que comiencen a usar el modo estricto ahora. Hay suficientes navegadores que lo admiten que el modo estricto legítimamente ayudará a evitar errores de los que ni siquiera sabíamos que estaban en su código.

    Aparentemente, en la etapa inicial habrá errores que nunca hemos encontrado antes. Para obtener el beneficio completo, debemos realizar las pruebas adecuadas después de cambiar al modo estricto para asegurarnos de que hemos capturado todo. Definitivamente no solo lanzamos use strict en nuestro código y asumimos que no hay errores. Por lo tanto, lo importante es que es hora de comenzar a usar esta característica de lenguaje increíblemente útil para escribir un mejor código.

    Por ejemplo,

     
    var person = {
        name : 'xyz',
        position : 'abc',
        fullname : function () {  "use strict"; return this.name; }
    };
    

    JSLint es un depurador escrito por Douglas Crockford. Simplemente pegue su secuencia de comandos, y analizará rápidamente cualquier problema y error notables en su código.

        
    131
    2016-02-25 15: 54: 56Z
    1. @ JamieHutber: visite este enlace caniuse.com/use-strict AND kangax.github.io/es5-compat-table. Le dará una idea exacta para todos los navegadores.
      2014-01-18 13: 21: 12Z

    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 futuras versiones de los estándares ECMAScript introduzcan use como una palabra clave real; por lo tanto, las citas se volverían obsoletas.
    •  use strict se puede usar solo al comienzo 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 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 use strict. El contenido de una función se considera código estricto cuando la propia función se define en un código estricto o cuando la función contiene una directiva 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 use strict en sí.

    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 puede usar la declaración with en modo estricto.
    • En el 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á una ReferenceError. En el modo normal, el identificador se declara implícitamente como una variable global (como una propiedad del Object global)
    • En el modo estricto, la palabra clave this tiene el valor undefined en funciones que se invocaron como funciones (no como métodos). (En el modo normal, el 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 }());
    
    • También cuando se invoca una función con call() o apply en modo estricto, this es exactamente el valor del primer argumento de la invocación 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 (ya que puede hacerlo en el modo normal). En su lugar, se crea un nuevo alcance para eval() y las variables y funciones están dentro de ese alcance. 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 normalmodo 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 el modo estricto obtendrá un SyntaxError cuando al operador delete le sigue un identificador no calificado (una variable, función o parámetro de función). En el modo normal, la expresión delete no haría nada y se evalúa a 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 delete se evalúa como false).
    • En el 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 no se permiten los octales (estos son literales que comienzan con 0x. (En el modo normal, algunas implementaciones permiten los literales octales.)
    • En modo estricto, los identificadores eval y 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 el modo estricto hay más restricciones en 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.
    92
    2015-07-12 20: 31: 23Z
    1. "En modo estricto, los literales octales no están permitidos (estos son literales que comienzan con 0x ...)" los literales octal comienzan con un 0 inicial.
      2016-08-11 19: 52: 32Z

    Mis dos centavos:

    Uno de los objetivos del modo estricto es permitir una depuración más rápida de los problemas. Ayuda a los desarrolladores al lanzar una excepción cuando ocurren ciertas cosas incorrectas que pueden causar el silencio & Comportamiento extraño de tu página web. En el momento en que usamos use strict, el código arrojará errores que ayudarán al desarrollador a solucionarlo por adelantado.

    Pocas cosas importantes que he aprendido después de usar use strict:

    Evita la declaración de variables globales:

     
    var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};
    
    function Tree(typeOfTree) {
        var age;
        var leafCount;
    
        age = typeOfTree.age;
        leafCount = typeOfTree.leafCount;
        nameoftree = typeOfTree.name;
    };
    
    var tree1 = new Tree(tree1Data);
    console.log(window);
    

    Ahora, este código crea nameoftree en el alcance global al que se puede acceder utilizando window.nameoftree. Cuando implementamos use strict, el código arrojaría un error.

      

    Referencia no detectada Error: nameoftree no está definido

    Muestra

    Elimina la declaración with:

    Las declaraciones with no se pueden minimizar con herramientas como uglify-js . También están en desuso y se eliminaron de las futuras versiones de JavaScript.

    Muestra

    Previene duplicados:

    Cuando tenemos propiedades duplicadas, produce una excepción

      

    SyntaxError no capturado: propiedad de datos duplicada en objeto literal no   permitido en modo estricto

     
    "use strict";
    var tree1Data = {
        name: 'Banana Tree',
        age: 100,
        leafCount: 100000,
        name:'Banana Tree'
    };
    

    Hay pocos más, pero necesito obtener más conocimiento sobre eso.

        
    80
    2014-10-21 13: 31: 24Z

    Si usa 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 anteriores a ECMAScript 5 que se convirtieron en el estándar actual no lo admiten.

    Las citas alrededor del 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 solo causan el funcionamiento incorrecto del script de alguna manera difícil de detectar en los antiguos navegadores).

        
    59
    2012-03-10 03: 31: 15Z
    1. Entonces, ¿qué hace?
      2012-05-20 14: 47: 37Z
    2. ... esto describe en parte la compatibilidad, pero no lo que realmente hace.
      2012-07-11 16: 04: 02Z

    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 , usando una de las palabras clave recién reservadas (en previsión para ECMAScript 6 ): implements, interface, let, package , private, protected, public, static y yield.

    • Declaración de 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 ( bug 1041128 ).

    • Declarar 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();
      
    • Uso de delete en un nombre de variable delete myVariable;

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

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

    Fuentes:

    55
    2017-10-24 10: 50: 18Z

    El modo estricto realiza varios cambios en la semántica normal de JavaScript:

    • elimina algunos errores silenciosos de JavaScript al cambiarlos para lanzar errores.

    • corrige errores que dificultan JavaScript motores para realizar optimizaciones.

    • prohíbe que se defina cierta sintaxis en el futuro versiones de ECMAScript.

    para obtener más información, visite Strict Mode- Javascript

        
    51
    2014-10-29 17: 34: 22Z

    "Use Strict"; es un seguro que el programador no utilizará las propiedades sueltas o malas de JavaScript. Es una guía, al igual que una regla le ayudará a hacer líneas rectas. "Usar estricto" te ayudará a hacer "Codificación directa".

    Aquellos que prefieren no usar reglas para hacer sus líneas directamente terminan en esas páginas pidiendo a otros que depuren su código.

    Créeme. La sobrecarga es insignificante en comparación con el código mal diseñado. Doug Crockford, que ha sido un senior Desarrollador de JavaScript desde hace varios años, tiene una publicación muy interesante aquí . Personalmente, me gusta volver a su sitio todo el tiempo para asegurarme de no olvidar mi buena práctica.

    La práctica moderna de JavaScript siempre debe evocar el "Uso estricto"; pragma. La única razón por la que el Grupo ECMA ha hecho opcional el modo "Estricto" es para permitir que los codificadores menos experimentados accedan a JavaScript y dar tiempo para que se adapte a las nuevas y más seguras prácticas de codificación.

        
    49
    2014-10-26 10: 34: 02Z
    1. La razón por la cual el modo estricto es opcional no tiene nada que ver con lo que has declarado. La verdadera razón por la que es no romper el código existente que puede no ser compatible .
      2013-10-31 13: 34: 21Z
    2. De hecho, los codificadores menos experimentados deberían ser los primeros para habilitar el "uso estricto";
      2014-08-19 05: 37: 20Z

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

        
    44
    2016-02-25 15: 55: 42Z

    Cotización de w3schools :

      

    La directiva de "uso estricto"

         

    La directiva de "uso estricto" es nueva en JavaScript 1.8.5 (ECMAScript   versión 5).

         

    No es una declaración, sino una expresión literal, ignorada por anteriores   versiones de JavaScript.

         

    El propósito de "uso estricto" es indicar que el código debe ser   ejecutado en "modo estricto".

         

    Con el modo estricto, no puede, por ejemplo, usar variables no declaradas.

         

    ¿Por qué el modo estricto?

         

    El modo estricto facilita la escritura de JavaScript "seguro".

         

    El modo estricto cambia la "sintaxis incorrecta" aceptada previamente en errores reales.

         

    Como ejemplo, en JavaScript normal, se crea mal el nombre de una variable   Una nueva variable global. En modo estricto, esto arrojará un error,   haciendo imposible crear accidentalmente una variable global.

         

    En JavaScript normal, un desarrollador no recibirá ningún comentario de error   asignando valores a propiedades no grabables.

         

    En modo estricto, cualquier asignación a una propiedad no grabable, un   propiedad exclusiva para captadores, una propiedad no existente, una propiedad no existente   La variable, o un objeto no existente, generará un error.

    Consulte http://www.w3schools.com/js/js_strict.asp saber más

        
    38
    2018-08-13 03: 15: 37Z

    "use strict" hace que el código JavaScript se ejecute en modo estricto , lo que básicamente significa que todo debe definirse antes de su uso. La razón principal para usar el modo estricto es evitar usos globales accidentales de métodos indefinidos.

    También en modo estricto, las cosas se ejecutan más rápido, algunas advertencias o advertencias silenciosas producen errores fatales, es mejor usarlo siempre para hacer un código más limpio.

    "use strict" es muy necesario para su uso en ECMA5, en ECMA6 es parte de JavaScript por defecto , por lo que no es necesario agregarlo si está utilizando ES6.

    Mire estas declaraciones y ejemplos de MDN:

      

    La directiva de "uso estricto"
    La directiva de "uso estricto" es nueva en   JavaScript 1.8.5 (ECMAScript versión 5). No es una declaración, sino una   Expresión literal, ignorada por versiones anteriores de JavaScript. los   El propósito de "uso estricto" es indicar que el código debe ser   ejecutado en "modo estricto". Con el modo estricto, no se puede, por ejemplo,   usa variables no declaradas.

         

    Ejemplos de uso de "uso estricto":
      Modo estricto para funciones: Del mismo modo, para invocar el modo estricto para un   función, poner la declaración exacta "uso estricto"; (o 'uso estricto';) en   el cuerpo de la función antes de cualquier otra declaración.

    1) modo estricto en funciones

     
     function strict() {
         // Function-level strict mode syntax
         'use strict';
         function nested() { return 'And so am I!'; }
         return "Hi!  I'm a strict mode function!  " + nested();
     }
     function notStrict() { return "I'm not strict."; }
    
     console.log(strict(), notStrict());
    

    2) modo estricto de script completo

     
    'use strict';
    var v = "Hi! I'm a strict mode script!";
    console.log(v);
    

    3) Asignación a un global no escribible

     
    'use strict';
    
    // Assignment to a non-writable global
    var undefined = 5; // throws a TypeError
    var Infinity = 5; // throws a TypeError
    
    // Assignment to a non-writable property
    var obj1 = {};
    Object.defineProperty(obj1, 'x', { value: 42, writable: false });
    obj1.x = 9; // throws a TypeError
    
    // Assignment to a getter-only property
    var obj2 = { get x() { return 17; } };
    obj2.x = 5; // throws a TypeError
    
    // Assignment to a new property on a non-extensible object.
    var fixed = {};
    Object.preventExtensions(fixed);
    fixed.newProp = 'ohai'; // throws a TypeError
    

    Puede lea más en MDN .

        
    33
    2018-08-30 15: 16: 03Z

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

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

        
    29
    2014-03-29 19: 39: 26Z

    Pequeños ejemplos para comparar:

    Modo no estricto:

     
    for (i of [1,2,3]) console.log(i)
        
    // output:
    // 1
    // 2
    // 3

    Modo estricto:

     
    'use strict';
    for (i of [1,2,3]) console.log(i)
    
    // output:
    // Uncaught ReferenceError: i is not defined

    Modo no estricto:

     
    String.prototype.test = function () {
      console.log(typeof this === 'string');
    };
    
    'a'.test();
    
    // output
    // false

     
    String.prototype.test = function () {
      'use strict';
      
      console.log(typeof this === 'string');
    };
    
    'a'.test();
    
    // output
    // true
        
    20
    2018-11-18 16: 31: 07Z
    1. Observe que el código anterior agregará la variable i al alcance global (en general, esto no es una mejor práctica y modo estricto ayuda a evitar eso).
      2017-02-18 12: 41: 13Z
    2. ¿Alguien puede explicar el segundo ejemplo? No lo entiendo ¿No debería this === 'a' en ambos ejemplos?
      2019-02-06 09: 24: 02Z

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

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

      
    • El código global es un 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 siempre es un código de modo estricto.
    •   
    • Todas las partes de ClassDeclaration o 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 el FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition o ArrowFunction está contenido en el código de modo estricto o si el código que produce el valor de la función [[ ECMAScriptCode]] la ranura interna 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.
    •   
        
    18
    2016-04-12 00: 25: 07Z

    Las principales razones por las que se desarrollapers deben usar "use strict" son:

    1. Evita la declaración accidental de variables globales. El uso de "use strict()" se asegurará de que las variables se declaren con var antes de su uso. Por ejemplo:

       
      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. N.B: la directiva "use strict" solo se reconoce al comienzo de un script o una función.
    3. La cadena "arguments" no se puede usar como variable:

       
      "use strict";
      var arguments = 3.14;    // This will cause an error
      
    4. Restringirá el uso 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, hará que escriba un buen código.

    Para obtener más información al respecto, puede consultar aquí .

        
    12
    2017-06-18 03: 14: 24Z

    "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 idiomas 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 existe tal cosa como variables tipificadas, métodos tipificados, etc. Recomiendo encarecidamente 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. Funcionará mejor y será más fácil de depurar.

        
    11
    2016-06-14 23: 18: 44Z

    use strict es una forma de hacer que su código sea más seguro, ya que no puede usar funciones peligrosas que pueden funcionar no como espera. Y como se escribió antes de que el código sea más estricto.

        
    10
    2016-05-17 22: 31: 29Z

    Use Strict se usa para mostrar errores comunes y repetidos para que se maneje de manera diferente, y cambie la forma en que se ejecuta el script java, tales cambios son:

    • Evita los globales accidentales

    • No hay duplicados

    • Elimina con

    • Elimina esta coacción

    • Evaluación más segura ()

    • Errores para inmutables

    también puede leer esto artículo para los detalles

        
    10
    2016-10-17 14: 09: 17Z
    Se introdujo el modo "estricto" de JavaScript en ECMAScript 5.  
    (function() {
      "use strict";
      your code...
    })();
    

    Al escribir "use strict"; en la parte superior de su archivo JS se activan las reglas Comprobación de la sintaxis. Realiza las siguientes tareas para nosotros:

    1. muestra un error si intenta asignar una variable no declarada

    2. le impide sobrescribir las bibliotecas del sistema JS de claves

    3. prohíbe algunas funciones de lenguaje inseguras o propensas a errores

    use strict también funciona dentro de funciones individuales. Siempre es una mejor práctica incluir use strict en su código.

    Problema de compatibilidad del navegador: Las directivas de "uso" están destinadas a ser compatibles con versiones anteriores. Los navegadores que no los admiten solo verán un literal de cadena al que no se hace referencia más. Entonces, lo pasarán por alto y seguirán adelante.

        
    10
    2019-02-06 09: 40: 32Z

    Normalmente, JavaScript no sigue reglas estrictas, lo que aumenta las posibilidades de errores. Después de usar "use strict", el código JavaScript 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 se usa "use strict", el código debe escribirse siguiendo un conjunto estricto de reglas, por lo tanto, disminuyendolas posibilidades de errores y ambigüedades.

        
    9
    2019-01-04 02: 04: 58Z
    1. buen trabajo bikash ....
      2019-06-04 06: 35: 30Z

    "uso estricto"; Define que el código JavaScript debe ser ejecutado en    "modo estricto".

    • La directiva de "uso estricto" era nueva en la versión 5 de ECMAScript
    • No es una declaración, sino una expresión literal, ignorada por anteriores versiones de JavaScript.
    • El propósito de "uso estricto" es indicar que el código debe ser ejecutado en "modo estricto".
    • Con el modo estricto, no puede, por ejemplo, usar variables no declaradas.

    Todos los navegadores modernos admiten "uso estricto", excepto Internet Explorer 9 y versiones inferiores .

    Desventaja

    Si un desarrollador usó una biblioteca que estaba en modo estricto, pero el desarrollador estaba acostumbrado a trabajar en modo normal, podrían llamar a algunas acciones en la biblioteca que no funcionarían como se esperaba.

    Peor, ya que el desarrollador está en modo normal, no tienen las ventajas de que se produzcan errores adicionales, por lo que el error puede fallar en silencio.

    Además, como se indica más arriba, el modo estricto le impide hacer ciertas cosas.

    La gente generalmente piensa que no debes usar esas cosas en primer lugar, pero a algunos desarrolladores no les gusta la restricción y quieren usar todas las características del lenguaje.

    3
    2019-01-28 10: 42: 25Z
fuente colocada aquí