¿Qué significa “uso estricto” se puede hacer en JavaScript, y cuál es el razonamiento detrás de él?
-
20-09-2019 - |
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?
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)
-
No permite las variables globales. (Las capturas que faltan declaraciones
var
y errores ortográficos en los nombres de variables) -
Silent asignaciones que fallan tirarán error en modo estricto (asignación
NaN = 5;
) -
Los intentos de eliminar las propiedades undeletable arrojará (
delete Object.prototype
) -
requiere que todos los nombres de las propiedades de un objeto literal que ser único (
var x = {x1: "1", x1: "2"}
) -
nombres de los parámetros de función deben ser únicos (
function sum (x, x) {...}
) -
Prohíbe sintaxis octal (
var x = 023;
algunos desarrolladores asumen erróneamente que un cero precedente no hace nada para cambiar el número.) -
Prohíbe la palabra clave
with
-
eval
en modo estricto no introduce nuevas variables -
Prohíbe borrar nombres de fricción (
delete x;
) -
Prohíbe unión o asignación de los nombres
eval
yarguments
en cualquier forma -
El modo estricto no propiedades del alias del objeto
arguments
con los parámetros formales. (Es decir, enfunction sum (a,b) { return arguments[0] + b;}
Esto funciona porquearguments[0]
está obligado aa
y así sucesivamente.) -
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?
-
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. -
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 prefijonew
cuando se llama a una función constructora, lathis
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 athis
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, y08
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
ycaller
propiedades. Esto hace que sea posible para pasar suarguments
a que no se confía código sin renunciar a un montón de contexto confidencial. También elarguments
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 dedelete
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
, yyield
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 introducenuse
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á unaReferenceError
. En el modo normal, el identificador se declara implícitamente como una variable global (como una propiedad de laObject
global) - En el modo estricto la palabra clave
this
tiene laundefined
valor en las funciones que se invoca como funciones (no como métodos). (Enthis
modo normal siempre apunta a laObject
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()
oapply
en modo estricto, entoncesthis
es exactamente el valor del primer argumento de la invocacióncall()
orapply()
. (En condiciones normalesnull
modo yundefined
se sustituyen por elObject
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 deeval()
y las variables y funciones están dentro de ese ámbito. Ese ámbito se destruye después deeval()
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 operadordelete
es seguido por un identificador cualificado no (una variable, función o parámetro de función). En el modo normal de la expresióndelete
no haría nada y se evaluó afalse
. - 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óndelete
se evalúa afalse
). - 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
yarguments
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
yarguments.callee
causan unaTypeError
en una función en modo estricto. Por otra parte, algunas propiedades caller- y argumentos de las funciones en el modo estricto causan unaTypeError
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
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.
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
, yyield
. -
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 variabledelete myVariable;
-
El uso de
eval
oarguments
como nombre de variable o argumento de la función"use strict"; arguments++; var obj = { set p(arguments) { } }; try { } catch (arguments) { } function arguments() { }
Fuentes:
-
transición a modo estricto en MDN
-
Modo estricto de JavaScript y por qué se debe utilizar en el blog de Colin J. Ihrig (versión archivada)
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.
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:
-
Evita la declaración accidental de
"use strict()"
variables.Using mundial se asegurará de que las variables se declaran convar
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'}; }
- N.B:. La directiva
"use strict"
sólo se registran en el comienzo de un script o una función -
El
"arguments"
cadena no puede ser utilizado como una variable:"use strict"; var arguments = 3.14; // This will cause an error
-
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:
-
muestra un error si se intenta asignar a una variable no declarada
-
hace que deje de sobrescribir las bibliotecas JS clave del sistema
-
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.
-
Por ejemplo básico y para la referencia ir a través de:
https://www.tutorialsteacher.com/javascript/javascript-strict
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.