¿Qué significa “uso estricto” se puede hacer en JavaScript, y cuál es el razonamiento detrás de él?

StackOverflow https://stackoverflow.com/questions/1335851

Pregunta

Recientemente, me encontré con algunos de mi código JavaScript a través Crockford JSLint , y se lo dio el siguiente error:

  

Problema en la línea 1 carácter 1: Falta "use strict" declaración

.

Haciendo un poco de búsqueda, me di cuenta de que algunas personas agregan "use strict"; en su código JavaScript. Una vez que he añadido el comunicado, el error dejó de aparecer. Desafortunadamente, Google no reveló gran parte de la historia detrás de esta afirmación cadena. Desde luego que debe tener algo que ver con la forma en que el JavaScript es interpretado por el navegador, pero no tengo ni idea de cuál sería el efecto.

Entonces, ¿qué es "use strict"; todo esto, ¿qué implica y es todavía relevante?

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

¿Fue útil?

Solución

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

Para citar algunas partes interesantes:

  

Modo estricto es una nueva característica de ECMAScript 5 que le permite colocar un programa o una función, en un contexto operativo "estricta". Este contexto estricta evita que ciertas acciones sean tomadas y lanza más excepciones.

Y:

  

El modo estricto ayuda a cabo en un par de maneras:

     
      
  • Se llama algunas tomas falsas comunes de codificación, lanzar excepciones.
  •   
  • Se evita, o lanza errores, cuando se toman acciones relativamente "seguras" (tales como el acceso al objeto global).
  •   
  • Desactiva características que son confusas o mal pensado.
  •   

Tenga en cuenta también se puede aplicar "modo estricto" a todo el archivo ... O puede utilizar sólo 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 usted tiene que mezclar código antiguo y el nuevo; -)

Por lo tanto, supongo que es un poco como el "use strict" puede utilizar en Perl (de ahí el nombre?): Le ayuda a hacer menos errores, mediante la detección de más cosas que podrían conducir a roturas <. / p>

El modo estricto está ahora compatible con todos los principales navegadores .

Dentro módulos de ECMAScript nativos (con declaraciones import y export) y clases ES6 , el modo estricto está siempre activada y no se puede desactivar.

Otros consejos

Es una nueva característica de ECMAScript 5. Juan Resig redactó un buen resumen de la misma.

Es una cadena que pone en sus archivos JavaScript (ya sea en la parte superior de su archivo o en el interior de una función) que se parece a esto:

"use strict";

Ponerlo en su código ya no debe causar ningún problema con los navegadores actuales, ya que es sólo una cadena. Esto puede causar problemas con su código en el futuro si su código viola el pragma. Por ejemplo, si actualmente dispone foo = "bar" sin definir foo en primer lugar, el código se comienzan a fallar ... lo cual es una buena cosa en mi opinión.

El "use strict"; declaración indica al navegador que utilice el modo estricto, que es un conjunto reducido y la función de JavaScript más seguro.

Lista de características (no exhaustivos)

  1. No permite las variables globales. (Las capturas que faltan declaraciones var y errores ortográficos en los nombres de variables)

  2. Silent asignaciones que fallan tirarán error en modo estricto (asignación NaN = 5;)

  3. Los intentos de eliminar las propiedades undeletable arrojará (delete Object.prototype)

  4. requiere que todos los nombres de las propiedades de un objeto literal que ser único (var x = {x1: "1", x1: "2"})

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

  6. Prohíbe sintaxis octal (var x = 023; algunos desarrolladores asumen erróneamente que un cero precedente 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. Prohíbe borrar nombres de fricción (delete x;)

  10. Prohíbe unión o asignación de los nombres eval y arguments en cualquier forma

  11. El modo estricto no propiedades del alias 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á obligado a a y así sucesivamente.)

  12. arguments.callee no se admite

[Ref: modo estricto , Mozilla Developer Network ]

Si la gente está preocupada acerca del uso de use strict podría valer la pena mirar este artículo:

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

Se habla de soporte de los navegadores, pero lo más importante cómo tratar con ella 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.
*/

Una palabra de precaución, todo lo que los programadores difíciles de carga: aplicar "use strict" al código existente puede ser peligroso! Esto no es una sensación de bienestar, etiqueta engomada feliz-cara que se puede dar una palmada en el código para que sea 'mejor'. Con el pragma "use strict", el navegador de repente lanzar excepciones en lugares al azar que nunca tiró antes sólo porque en ese lugar que está haciendo algo que por defecto / suelta JavaScript permite felizmente, pero estricta JavaScript aborrece! Es posible que tenga violaciónes rigurosidad escondido en las llamadas rara vez se utilizan en el código que sólo se producirá una excepción cuando finalmente se deje correr - por ejemplo, en el entorno de producción que sus clientes de pago utilizan

Si se va a dar el paso, es una buena idea para aplicar "use strict" junto con las pruebas unitarias completas y una estricta configurado JSHint construir tarea que le dará cierta confianza en que no hay rincón oscuro de su módulo que va a estallar horrible sólo porque te has convertido en el modo estricto. O, bueno, aquí hay otra opción: simplemente no cuadran "use strict" a cualquiera de su código heredado, es probablemente más seguro de esa manera, la verdad. Sin duda, no añadir "use strict" a cualquier módulo que no tiene o mantener, como módulos de terceros.

Creo que a pesar de que es un animal enjaulado mortal, "use strict" puede ser bueno, pero hay que hacerlo bien. El mejor momento para ir es estricta cuando el proyecto es totalmente nuevo y que está empezando desde cero. Configurar JSHint/JSLint con todas las advertencias y las opciones del barrio sube tan fuerte como su equipo puede soportar, conseguir un buen sistema de construcción / prueba / aserción du jour aparejado como Grunt+Karma+Chai, y sólo entonces empezar a marcar todos sus nuevos módulos como "use strict". Esté preparado para curar una gran cantidad de errores y advertencias niggly. Asegúrese de que todo el mundo entiende la gravedad mediante la configuración de la acumulación a fallar si JSHint/JSLint produce ningún violaciónes.

Mi proyecto no era un proyecto de nueva creación, 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 se queja de que JSHint. Es un recordatorio para mí de lo que debería hacer refactorización en el futuro. Mi objetivo es ser la marca roja libre debido a todas mis declaraciones "use strict" desaparecidos, pero que está a años de distancia ahora.

Uso 'use strict'; no de golpe hace que el código sea mejor.

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

'use strict';

Cuando un motor de JavaScript ve esto Directiva , que empieza a interpretar el código en un modo especial. En este modo, los errores son lanzados al ser se detectan determinados prácticas de codificación que podrían terminar errores potenciales (que es el razonamiento detrás del modo estricto).

Considere este ejemplo:

var a = 365;
var b = 030;

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

Para obtener una lista no exhaustiva de las especialidades en el modo estricto, ver esta respuesta .


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

  • En mi nueva aplicación de JavaScript:!. Absolutamente El modo estricto se puede utilizar como un denunciante cuando usted está haciendo algo estúpido con su código

  • En mi existente El código JavaScript: Probablemente no Si el código JavaScript existente tiene declaraciones que estén prohibidas en estricta modo, la aplicación simplemente romper. Si desea que el modo estricto, usted debe estar preparado para depurar y corregir su código existente. Esta es la razón por usando 'use strict'; no de golpe hace que el código sea mejor .


¿Cómo se utiliza el modo estricto?

  1. Inserte una declaración 'use strict'; en la parte superior de la secuencia de comandos:

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

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

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

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

    Todo en el ámbito léxico de la función doSomething será interpretada en modo estricto. La palabra ámbito léxico es importante aquí. Ver este respuesta para una mejor explicación.


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

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 ha sido confundido acerca de cómo funciona   están en el ámbito. A veces parecen estar en el ámbito de forma estática, pero algunos   características hacen que se comporten como si están en el ámbito de forma dinámica. Esto es   confuso, por lo que los programas difíciles de leer y entender.   Malentendido provoca errores. También es un problema para el rendimiento.   de alcance estática permitiría la unión a suceder en la variable de compilación   tiempo, pero el requisito de alcance dinámico significa la unión debe ser   aplazado hasta el tiempo de ejecución, que viene con una actuación significativa   penalti.

     

El modo estricto requiere que todo el enlace variable hacerse de forma estática.   Eso significa que las características que anteriormente requerían enlace dinámico   debe ser eliminado o modificado. En concreto, la sentencia with es   eliminado, y la capacidad de la función eval para manipular el   ámbito de su persona que llama está severamente restringido.

     

Uno de los beneficios del código estricto es que herramientas como compresor YUI   puede hacer un mejor trabajo cuando processing él.

     

Variables globales implícitas

     

JavaScript ha implicado variables globales. Si   no se declara explícitamente una variable, una variable global es   declarado implícitamente para usted. Esto hace más fácil para la programación   principiantes, ya que pueden descuidar algo de su limpieza básica   quehaceres. Pero hace que el manejo de los programas de mayor tamaño mucho más   difícil y se degrada significativamente la fiabilidad. Así, en estricta   el modo, las variables globales implicados ya no se crean. Debieras   declarar explícitamente todas las variables.

     

Global fuga

     

Hay una serie de situaciones que pueden ocasionar this   que quedará vinculado al objeto global. Por ejemplo, si se olvida   indicar el prefijo new cuando se llama a una función constructora, la   this del constructor será atado de forma inesperada al objeto global, por lo   en lugar de inicializar un nuevo objeto, que en vez estará en silencio   la manipulación de las variables globales. En estas situaciones, el modo estricto se   en lugar de obligar a this undefined, lo que hará que el constructor para   lanzar una excepción en su lugar, permitiendo que el error que se detecte mucho   antes.

     

El fracaso ruidoso

     

JavaScript siempre ha tenido propiedades de sólo lectura, pero   No les podría crear usted mismo hasta Object.createProperty de ES5   La función expuesta esa capacidad. Si intenta asignar un valor   a una propiedad de sólo lectura, que fracasaría en silencio. La asignación haría   No cambie el valor de la propiedad, pero su programa procedería como   a pesar de que lo había hecho. Esto es un peligro la integridad que pueden causar a los programas   entrar en un estado incoherente. En modo estricto, intentar cambiar una   Propiedad de sólo lectura arrojará una excepción.

     

Octal

     

El octal (o base 8) representación de los números era extremadamente   útil cuando se hace la programación a nivel de máquina en máquinas cuya palabra   tamaños eran un múltiplo de 3. Es necesario octal cuando se trabaja con los CDC   6600 mainframe, que tenía un tamaño de palabra de 60 bits. Si se podía leer   octal, usted podría mirar a una palabra como 20 dígitos. Dos dígitos representados   el código de operación, y un dígito identificaron a uno de los 8 registros. Durante el   transición lenta de los códigos de máquina a lenguajes de alto nivel, que era   pensado para ser útil para proporcionar formas octales en lenguajes de programación.

     

En C, un extremadamente lamentable representación de octalness era   seleccionado: cero inicial. Así que en C, significa 0100 64, no 100, y 08 es una   Error, no 8. Aún más, lamentablemente, este anacronismo ha sido   copiado en casi todas las lenguas modernas, como JavaScript, donde   sólo se utiliza para crear errores. No tiene ningún otro propósito. Así que en   modo estricto, formas octales ya no se permite.

     

Et cetera

     

La gama argumentos seudo se convierte en un poco más   array-como en ES5. En modo estricto, pierde su callee y caller   propiedades. Esto hace que sea posible para pasar su arguments a que no se confía   código sin renunciar a un montón de contexto confidencial. También el   arguments propiedad de las funciones se elimina.

     

En el modo estricto, claves duplicadas en un literal de la función producirá una   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 se produce una excepción. Primitivo   Los valores no están implícitamente envueltos.


Las palabras reservadas para futuras versiones de JavaScript

ECMAScript 5 añade una lista de palabras reservadas. Si se utilizan 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

Yo recomiendo que todos los desarrolladores a empezar a utilizar el modo estricto ahora. Hay suficientes navegadores que lo apoyan que el modo estricto va a ayudar legítimamente nos libre de errores que ni siquiera sabía que estaban en el código.

Al parecer, en la etapa inicial habrá errores nunca hemos encontrado antes. Para obtener el beneficio completo, tenemos que hacer las pruebas adecuadas después de cambiar a modo estricto para asegurarse de que hemos cogido todo. Definitivamente no nos limitamos a tirar use strict en nuestro código y suponemos que no hay errores. Por lo que la rotación es que es el momento de empezar a utilizar esta característica del 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 en su guión, y que va a escanear rápidamente para cualquier problema notable y errores en el código.

Me gustaría ofrecer una respuesta un tanto más fundada que complementa las otras respuestas. Tenía la esperanza de modificar la respuesta más popular, pero fracasó. He intentado que sea lo más amplia y completa que pude.

Se puede hacer referencia a la documentación de MDN para más información.

"use strict" directiva introducido en ECMAScript 5.

Directivas son similares a las declaraciones, sin embargo, diferente.

  • use strict no contiene palabras clave: La directiva es una declaración de la expresión simple, que consiste en una cadena especial literal (entre comillas simples o dobles). motores de JavaScript, que no implementen ECMAScript 5, sólo ven una declaración de la expresión y sin efectos secundarios. Se espera que las futuras versiones de los estándares de ECMAScript introducen use como una palabra clave real; las cotizaciones serían por lo tanto llegar a ser obsoletos.
  • use strict sólo se puede utilizar en el inicio de una secuencia de comandos o de una función, es decir, que debe preceder a todos los demás declaración (real). No tiene que ser la primera instrucción en una secuencia de comandos de la función: puede ser precedida por otras expresiones de los estados que consisten en cadenas literales (e implementaciones de JavaScript puede tratarlos como directivas específicas de aplicación). declaraciones literales de cadena, que siguen a una primera declaración de bienes (en un script o función) son declaraciones de expresión simples. Los intérpretes no deben interpretarlos como directrices y no tienen ningún efecto.

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

El modo estricto de ECMAScript 5 es un subconjunto restringido del lenguaje JavaScript, lo que elimina los déficits relevantes de la lengua y las características más estricta comprobación de errores y una mayor seguridad. Las siguientes listas de las diferencias entre el modo estricto y el modo normal (de los cuales los tres primeros son particularmente importantes):

  • No se puede utilizar el with-afirmación en modo estricto.
  • En el modo estricto todas las variables tienen que ser declarada: si asigna un valor a un identificador que no ha sido declarada como variable, función, parámetro de la función, la captura cláusula parámetro o la propiedad de la Object mundial, por lo que recibirá una ReferenceError. En el modo normal, el identificador se declara implícitamente como una variable global (como una propiedad de la Object global)
  • En el modo estricto la palabra clave this tiene la undefined valor en las funciones que se invoca como funciones (no como métodos). (En this modo normal siempre apunta a la Object global). Esta diferencia puede ser utilizado para probar si una aplicación es compatible con el modo estricto:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • Además, cuando se invoca una función con call() o apply en modo estricto, entonces this es exactamente el valor del primer argumento de la invocación call()or apply(). (En condiciones normales null modo y undefined se sustituyen por el Object y los valores global, que no son objetos, son lanzados en objetos.)

  • En el modo estricto obtendrá un TypeError, cuando se intenta asignar a las propiedades de sólo lectura o para definir nepropiedades W para un objeto no extensible. (En el modo normal tanto simplemente fallar sin mensaje de error.)

  • En el modo estricto, al pasar de código para eval(), no se puede declarar o definir variables o funciones en el ámbito de la persona que llama (como se puede hacerlo en modo normal). En su lugar, se crea un nuevo ámbito de eval() y las variables y funciones están dentro de ese ámbito. Ese ámbito se destruye después de eval() finaliza la ejecución.
  • En el modo estricto los argumentos a objetos de una función contiene una copia estática de los valores, que se pasan a la función. En el modo normal los argumentos de objeto tiene una "mágica" comportamiento algo:. Los elementos de la matriz y de referencia de los parámetros de la función nombrados ambos el mismo valor
  • En el modo estricto obtendrá un SyntaxError cuando el operador delete es seguido por un identificador cualificado no (una variable, función o parámetro de función). En el modo normal de la expresión delete no haría nada y se evaluó a false.
  • En el modo estricto obtendrá un TypeError cuando intenta eliminar una propiedad no configurable. (En el modo normal, el intento simplemente falla y la expresión delete se evalúa a 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 ningún error.)
  • En el modo estricto se considera un error sintáctico cuando una declaración de la función tiene varios parámetros con el mismo nombre. (En el modo normal no hay ningún error.)
  • En literales octales modo estricto no pueden (estos son los literales que comienzan con 0x. (En el modo normal algunas implementaciones no se permiten literales octales.)
  • En el modo estricto los identificadores eval y arguments son tratados como palabras clave. No puede cambiar su valor, no se puede asignar un valor a ellos, y no se puede utilizar como nombres de variables, funciones, parámetros de función o identificadores de un bloque catch.
  • En el modo estricto son más restricciones a las posibilidades de examinar la pila de llamadas. arguments.caller y arguments.callee causan una TypeError en una función en modo estricto. Por otra parte, algunas propiedades caller- y argumentos de las funciones en el modo estricto causan una TypeError cuando intenta leerlos.

Mis dos centavos:

Uno de los objetivos de modo estricto es para permitir la depuración más rápida de los problemas. Ayuda a los desarrolladores de lanzar una excepción cuando ciertas cosas malas ocurren que pueden provocar un comportamiento extraño y silencioso de su página web. En el momento en que utilizamos use strict, el código tirará errores que ayuda desarrollador para fijar de antemano.

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 de alcance global que se puede acceder utilizando window.nameoftree. Cuando ponemos en práctica el código use strict tiraría de error.

  

ReferenceError no detectada: nameoftree no se define

muestra

Elimina comunicado with:

with declaraciones no pueden ser minified uso de herramientas como afear-js . Son también obsoleta y retirado de las futuras versiones de JavaScript.

muestra

Previene Duplicados:

Cuando tenemos la propiedad duplicado, se produce una excepción

  

SyntaxError no detectada: la propiedad de datos duplicados en el literal objeto no   permitido en modo estricto

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

Hay pocos más, pero necesitan ganar más conocimiento sobre ello.

Si utiliza un navegador lanzado en el último año o así, entonces lo más probable es compatible con el modo estricto JavaScript. Sólo los navegadores más viejos alrededor antes de ECMAScript 5 se convirtieron en la norma actual no lo soportan.

Las comillas en el comando asegurarse de que el código seguirá funcionando en navegadores antiguos, así (a pesar de las cosas que generan un error de sintaxis en modo estricto por lo general acaba de causar el guión a un mal funcionamiento de alguna difícil de detectar manera en los mayores navegadores).

Al añadir "use strict";, los siguientes casos arrojarán una SyntaxError antes de que el guión está ejecutando:

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

  • La declaración de función en bloques

    if(a<b){ function f(){} }
    
  • Octal sintaxis

    var n = 023;
    
  • punto this 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} 
    

    Esto ya no es el caso en ECMAScript 6 ( bug 1.041.128 ).

  • Declarar dos argumentos de la función con el mismo nombre de función

    f(a, b, b){}
    
  • Configuración de un valor a una variable no declarada

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

  • El uso de eval o arguments como nombre de variable o argumento de la función

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

Fuentes:

El modo estricto hace varios cambios a la semántica JavaScript normales:

  • elimina algunos errores silenciosos JavaScript cambiándolos arrojar errores.

  • corrige errores que hacen que sea difícil para JavaScript motores para realizar optimizaciones.

  • prohíbe alguna sintaxis probable que se define en el futuro versiones de ECMAScript.

Para obtener más información vistit estricto Mode- Javascript

"uso estricto"; Es un seguro que el programador no utilizará la suelta o las malas propiedades de JavaScript. Es una guía, al igual que un gobernante le ayudará a tomar las líneas rectas. "Uso estricto" le ayudará a hacer "codificación recta".

Los que prefieren no utilizar gobernantes para hacer sus líneas rectas por lo general terminan en esas páginas pidiendo a otros a depurar su código.

Créeme. La sobrecarga es insignificante en comparación con el código mal diseñado. href="http://www.yuiblog.com/blog/2010/12/14/strict-mode-is-coming-to-town/" Doug Crockford, que ha sido el último año JavaScript desarrollador durante varios años, tiene un post muy interesante aquí . En lo personal, me gusta volver a su sitio todo el tiempo para asegurarse de que no me olvido de mi buena práctica.

La práctica moderna JavaScript debe siempre evocar el "uso estricto"; Pragma. La única razón por la que el Grupo ECMA ha hecho que el modo "estricto" opcional es permitir que los programadores con menos experiencia acceso a JavaScript y dan a continuación, tiempo para adaptarse a las nuevas y más seguras prácticas de codificación.

La inclusión de use strict en el comienzo de sus todos los archivos JavaScript sensibles desde este punto es una pequeña manera de ser un mejor programador JavaScript y evitar convertirse en variables aleatorias global y cambiar las cosas en silencio.

Citando w3schools :

  

El "uso estricto" Directiva

     

El "use strict" directiva es nuevo en JavaScript 1.8.5 (ECMAScript   versión 5).

     

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

     

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

     

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

     

¿Por qué modo estricto?

     

El modo estricto hace que sea más fácil de escribir "seguro" JavaScript.

     

cambios en el modo estricto aceptadas previamente "mala sintaxis" en errores reales.

     

A modo de ejemplo, en JavaScript normal, escribir mal un nombre de variable crea   una nueva variable global. En modo estricto, esto generará un error,   por lo que es imposible crear accidentalmente una variable global.

     

En JavaScript normal, un desarrollador no recibirá ninguna notificación de errores   la asignación de valores a las propiedades no modificables.

     

En el modo estricto, cualquier asignación a una propiedad para no grabable, una   captador establecimiento sólo, un no-existente propiedad, un no-existente   variable o un objeto no existente, generará un error.

Por favor, consulte http://www.w3schools.com/js/js_strict.asp saber más

"use strict" hace que el código JavaScript para funcionar en modo estricto , que básicamente significa que todo tiene que ser definido antes de su uso. La principal razón para usar el modo estricto es evitar usos globales accidentales de métodos no definidos.

También en el modo estricto, las cosas funcionen más rápido, algunas advertencias o avisos silenciosos generan errores fatales, es mejor usar siempre para hacer un código más limpio.

Se necesita ampliamente

"use strict" para ser utilizado en ECMA5, en ECMA6 es parte de JavaScript por defecto , por lo que no necesita ser añadido si usted está utilizando ES6.

Mira a estas declaraciones y ejemplos de MDN:

  

El "use strict" Directiva Francia El "uso estricto" directiva es nuevo en   1.8.5 JavaScript (ECMAScript la versión 5). No es una declaración, sino una   expresión literal, ignorado por versiones anteriores de JavaScript. los   propósito de "use strict" es para indicar que el código debe ser   ejecutado en "modo estricto". Con el modo estricto, no se puede, por ejemplo,   utilizar variables no declaradas.

     

Ejemplos del uso de "usar estricta":
  El modo estricto para funciones: Del mismo modo, para invocar el modo estricto para una   función, poner la declaración exacta "use strict"; (O 'usar estricta';) en   El cuerpo de la función antes de cualquier otra declaración.

1) el 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) el modo estricto todo-script

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

3) Asignación a un no-escribible mundial

'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 leer más sobre MDN .

Hay una buena charla de algunas personas que estaban en el comité de ECMAScript: Cambios en JavaScript, Parte 1 :. ECMAScript 5" sobre el uso de la forma incremental del interruptor "use strict" permite a los implementadores de JavaScript para limpiar una gran cantidad de las características peligrosas de JavaScript sin romper de repente todos los sitios web en el mundo

Por supuesto, también habla de lo que se acaba (fueron) muchas de esas características no implementadas y cómo ECMAScript 5 se las arregla.

Los pequeños ejemplos para comparar:

No-estricta modo:

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

El modo estricto:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

No-estricta modo:

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

Tenga en cuenta que use strict se 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 :

  
      
  • Código Mundial es el código de modo estricto si comienza con un prólogo Directiva que contiene una Directiva estricto uso (ver 14.1.1).
  •   
  • código del módulo de código es siempre el modo estricto.
  •   
  • Todas las partes de un ClassDeclaration o ClassExpression son código de modo estricto.
  •   
  • Eval código es el código de modo estricto si comienza con un prólogo Directiva que contiene un uso estricto de la Directiva o si la llamada a eval es una eval directa (ver 12.3.4.1) que está contenida en el código de modo estricto.
  •   
  • El código de función es el código de modo estricto si el asociado FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition o ArrowFunction está contenida en el código de modo estricto o si el código que produce el valor de la [[la función ECMAScriptCode]] ranura interna comienza con un prólogo Directiva que contiene un uso estricto de la Directiva.
  •   
  • El código de función que se proporciona como los argumentos de la función incorporada y constructores del generador es el código de modo estricto si el último argumento es una cadena que al ser procesada es un FunctionBody que comienza con una Directiva Prólogo que contiene un uso estricto de la Directiva.
  •   

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

  1. Evita la declaración accidental de "use strict()" variables.Using mundial se asegurará de que las variables se declaran 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" sólo se registran en el comienzo de un script o una función
  3. El "arguments" cadena no puede ser utilizado como una variable:

    "use strict";
    var arguments = 3.14;    // This will cause an error
    
  4. se restrinja el uso de palabras clave como variables. Tratando de usarlos arrojará errores.

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

Para leer mas sobre esto se puede hacer referencia aquí .

"utilizar estricta"; es el esfuerzo para hacer ECMA JavaScript un poco más robusto. Trae en JS un intento para que sea al menos un poco "estrictas" (otros idiomas implementar normas estrictas desde los años 90). En realidad, "obliga" a los desarrolladores de JavaScript siguen algún tipo de codificación de las mejores prácticas. Sin embargo, JavaScript es muy frágil. No hay tal cosa como las variables introducidas, métodos escritos, etc. Recomiendo los desarrolladores de JavaScript para aprender una lengua más completa como Java o ActionScript3, y aplicar las mismas mejores prácticas en el código JavaScript, funcionará mejor y será más fácil de depurar.

JavaScript modo “estricto” se introdujo en ECMAScript 5.

(function() {
  "use strict";
  your code...
})();

"use strict"; escritura en la parte superior de su archivo JS convierte en el estricto comprobación de sintaxis. Lo hace las siguientes tareas para nosotros:

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

  2. hace que deje de sobrescribir las bibliotecas JS clave del sistema

  3. prohíbe algunas características del lenguaje inseguras o propensos a errores

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

problema de compatibilidad del navegador: Las directivas de "uso" están destinados a ser compatible con versiones anteriores. Los navegadores que no son compatibles con ellos sólo verán una cadena literal que no se hace referencia más. Por lo tanto, van a pasar por él y seguir adelante.

use strict es una manera de hacer que el código más seguro, porque no se puede utilizar las características peligrosas que pueden no funcionar como se expect.and como se writed antes de que haga un código más estricto.

uso estricto se utiliza para mostrar los errores comunes y repetidas para que se maneja de manera diferente, y cambia la forma en java script se ejecuta, tales cambios son los siguientes:

  • Evita globales accidentales

  • No hay duplicados

  • Elimina con

  • elimina este coacción

  • Safer eval ()

  • Los errores de inmutables

También puede leer este artículo para los detalles

Normalmente, JavaScript no sigue reglas estrictas, por lo tanto, aumentar las posibilidades de errores. Después de usar "use strict", el código JavaScript debe seguir estricto conjunto de reglas que en otros lenguajes de programación tales como el uso de interruptores, la declaración antes de la inicialización, etc.

Si se utiliza "use strict", el código debe ser escrito siguiendo un estricto conjunto de reglas, por lo tanto, la disminución de las posibilidades de errores y ambigüedades.

"utilizar estricta"; Define que el código JavaScript debe ser ejecutado en    "Modo estricto".

  • El "use strict" directiva era nuevo en la versión 5 de ECMAScript.
  • No es una declaración, sino una expresión literal, ignorada por los principios versiones de JavaScript.
  • El propósito de "use strict" es para indicar que el código debe ser ejecutado en "modo estricto".
  • Con el modo estricto, no se puede, por ejemplo, utilizar variables no declaradas.

Todos los navegadores modernos soportan "uso estricto" excepto Internet Explorer 9 y menor .

Desventaja

Si un desarrollador utiliza una biblioteca que era en modo estricto, pero el desarrollador estaba acostumbrado a trabajar en el modo normal, se podría llamar algunas acciones en la biblioteca que no iba a funcionar como se espera.

Peor aún, ya que el desarrollador está en modo normal, que no tienen las ventajas de errores adicionales que son lanzadas, por lo que el error puede fallar en silencio.

Además, como se indica anteriormente, el modo estricto hace que deje de hacer ciertas cosas.

La gente generalmente piensa que no se debe usar esas cosas, en primer lugar, pero algunos desarrolladores no les gusta la restricción y desea utilizar todas las características de la lengua.

El modo estricto puede prevenir pérdidas de memoria.

Por favor, compruebe el funcionamiento de abajo escrita en modo no estricto:

function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); // Stack Overflow

En esta función, estamos usando una variable llamada name dentro de la función. Internamente, el compilador compruebe en primer lugar si hay alguna variable declarada con ese nombre en particular en ese ámbito de la función en particular. Desde el compilador entiende que no hay tal variable, se comprobará en el ámbito exterior. En nuestro caso, es el ámbito global. Una vez más, el compilador entiende que no hay tampoco una variable declarada en el espacio global con ese nombre, por lo que crea una variable para nosotros en el espacio global. Conceptualmente, esta variable se creará en el ámbito global y estará disponible en toda la aplicación.

Otro escenario es que, por ejemplo, la variable se declara en una función niño. En ese caso, el compilador comprueba la validez de esa variable en el ámbito exterior, es decir, la función madre. Sólo entonces se comprobará en el espacio global y crear una variable para nosotros allí. Eso significa que los controles adicionales se deben hacer. Esto afectará el rendimiento de la aplicación.


Ahora vamos a escribir la misma función en el modo estricto.

"use strict"
function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); 

Vamos a obtener el siguiente error.

Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5

A continuación, el compilador lanza el error de referencia. En modo estricto, el compilador no nos permite usar la variable sin declarar. Así pérdidas de memoria se pueden prevenir. Además, se puede escribir un código más optimizado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top