¿Qué hace "usar estricto" en JavaScript, y cuál es el razonamiento detrás de esto?
Frecuentes
Visto 1,120 equipos
7792
Recientemente, ejecuté parte de mi código JavaScript a través de Crockford's JSLint, y dio el siguiente error:
Problema en la línea 1, carácter 1: Falta la declaración "use estricto".
Al hacer una búsqueda, me di cuenta de que algunas personas agregan "use strict";
en 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 JavaScript, pero no tengo idea de cuál sería el efecto.
Entonces, ¿qué es "use strict";
en general, ¿qué implica y sigue siendo relevante?
¿Alguno de los navegadores actuales responde al "use strict";
cadena o es para uso futuro?
28 Respuestas
5077
Este artículo sobre el modo estricto de JavaScript puede interesarle: John Resig - Modo estricto de ECMAScript 5, JSON y más
Para citar algunas partes interesantes:
El modo estricto es una nueva característica de ECMAScript 5 que le permite colocar un programa, o una función, en un contexto operativo "estricto". Este contexto estricto evita que se tomen ciertas acciones y genera más excepciones.
Y:
El modo estricto ayuda de dos maneras:
- Detecta algunos errores de codificación comunes, lanzando excepciones.
- Previene, o arroja errores, cuando se toman acciones relativamente "inseguras" (como obtener acceso al objeto global).
- Desactiva funciones confusas o mal pensadas.
También tenga en cuenta que puede aplicar "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 es ahora compatible con los principales navegadores.
Dentro de módulos nativos de ECMAScript (con import
y export
declaraciones) y Clases de ES6, el modo estricto siempre está habilitado y no se puede deshabilitar.
Respondido 24 Oct 20, 00:10
1300
Es una función nueva de ECMAScript 5. John Resig escribió un buen resumen de la misma.
Es solo una cadena que pones en tus archivos JavaScript (ya sea en la parte superior de tu archivo o dentro de una función) que se ve así:
"use strict";
Ponerlo en su código ahora no debería causar ningún problema con los navegadores actuales, ya que es solo una cadena. Puede causar problemas con su código en el futuro si su código viola el pragma. Por ejemplo, si actualmente tiene foo = "bar"
sin definir foo
primero, su código comenzará a fallar ... lo cual es algo bueno en mi opinión.
Respondido 26 Oct 14, 10:10
697
La declaración "use strict";
indica al navegador que utilice el modo estricto, que es un conjunto de funciones de JavaScript reducido y más seguro.
Lista de características (no exhaustiva)
No permite variables globales. (Capturas perdidas
var
declaraciones y errores tipográficos en nombres de variables)Las asignaciones fallidas silenciosas arrojarán errores en modo estricto (asignando
NaN = 5;
)Los intentos de eliminar propiedades indelebles arrojarán (
delete Object.prototype
)Requiere que todos los nombres de propiedad en un objeto literal sean únicos (
var x = {x1: "1", x1: "2"}
)Los nombres de los parámetros de función deben ser únicos (
function sum (x, x) {...}
)Prohíbe la sintaxis octal (
var x = 023;
algunos desarrolladores asumen erróneamente que un cero precedente no hace nada para cambiar el número).Prohíbe el
with
keywordeval
en modo estricto no introduce nuevas variablesProhíbe eliminar nombres simples (
delete x;
)Prohíbe la vinculación o cesión de los nombres.
eval
yarguments
de cualquier maneraEl modo estricto no alias las propiedades del
arguments
objeto con los parámetros formales. (por ejemplo, enfunction sum (a,b) { return arguments[0] + b;}
Esto funciona porquearguments[0]
está obligado aa
y así. )arguments.callee
no es apoyado
[Árbitro: Modo estricto, Mozilla Developer Network]
respondido 11 mar '21, 23:03
El ejemplo de 11. no está claro, no está claro cuál es la diferencia en el modo estricto. - robar
433
Si la gente está preocupada por usar use strict
podría valer la pena consultar este artículo:
Compatibilidad con ECMAScript 5 'Modo estricto' en navegadores. ¿Qué significa esto?
NovoGeek.com - el weblog de Krishna
Habla sobre la compatibilidad con el navegador, pero lo que es más importante, cómo manejarlo de forma 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.
*/
Respondido el 22 de enero de 18 a las 11:01
222
Una palabra de advertencia, todos los programadores esforzados: aplicar "use strict"
el código existente puede ser peligroso! Esta cosa no es una pegatina de cara feliz que te haga sentir bien y que puedas pegarle al código para hacerlo "mejor". Con el "use strict"
pragma, el navegador arrojará repentinamente excepciones en lugares aleatorios que nunca antes arrojó solo porque en ese lugar estás haciendo algo que JavaScript predeterminado / suelto permite felizmente, ¡pero que el JavaScript estricto aborrece! Es posible que tenga infracciones de rigurosidad escondidas en llamadas poco utilizadas 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 de pago.
Si va a dar el paso, es una buena idea aplicar "use strict"
junto con pruebas unitarias completas y una tarea de compilación JSHint estrictamente configurada que le dará cierta confianza en que no hay un rincón oscuro de su módulo que explote horriblemente solo porque ha activado el modo estricto. O bien, aquí hay otra opción: simplemente no agregue "use strict"
a cualquiera de su código heredado, probablemente sea más seguro de esa manera, honestamente. DEFINITIVAMENTE NO add "use strict"
a cualquier módulo que no sea de su propiedad o que no mantenga, como módulos de terceros.
Creo que aunque es un animal enjaulado mortal, "use strict"
puede ser algo bueno, pero tienes que hacerlo bien. El mejor momento para ser estricto es cuando su proyecto es totalmente nuevo y está comenzando desde cero. Configurar JSHint/JSLint
con todas las advertencias y opciones ajustadas tan estrictamente como su equipo pueda soportar, obtenga un buen sistema de compilación / prueba / afirmación del día arreglado como Grunt+Karma+Chai
, y solo ENTONCES comience a marcar todos sus nuevos módulos como "use strict"
. Esté preparado para solucionar muchos errores y advertencias molestos. Asegúrese de que todos comprendan la gravedad configurando la compilación para FALLAR si JSHint/JSLint
produce cualquier infracción.
Mi proyecto no era un proyecto totalmente nuevo 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 debería hacer en el futuro. Mi objetivo es estar libre de marcas rojas debido a todas mis faltas. "use strict"
declaraciones, pero para eso faltan años.
Respondido 16 Oct 16, 10:10
195
Usar 'use strict';
no mejora repentinamente su código.
El Modo estricto de JavaScript es una característica en ECMAScript 5. Puede habilitar el modo estricto declarando esto en la parte superior de su script / función.
'use strict';
Cuando un motor de JavaScript ve esto Directivas, comenzará a interpretar el código en un modo especial. En este modo, los errores surgen cuando se detectan ciertas prácticas de codificación que podrían terminar siendo posibles errores (que es el razonamiento detrás del modo estricto).
Considere 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 valor 24
(en base 10). Sin embargo, el modo estricto arrojará un error.
Para obtener una lista no exhaustiva de especialidades en modo estricto, consulte esta respuesta.
Donde debo usar 'use strict';
?
En mi nueva Aplicación JavaScript: ¡Por supuesto! El modo estricto se puede usar como denunciante cuando está haciendo algo estúpido con su 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 el modo estricto, debe estar preparado para depurar y corregir su código existente. Esta es la razón por usando
'use strict';
no mejora repentinamente su código.
¿Cómo utilizo el modo estricto?
Insertar un
'use strict';
declaración en la parte superior de su guión:// File: myscript.js 'use strict'; var a = 2; ....
Tenga en cuenta que todo en el archivo
myscript.js
se interpretará en modo estricto.O inserte un
'use strict';
declaración en la parte superior de su cuerpo de función:function doSomething() { 'use strict'; ... }
Todo en el alcance léxico de función
doSomething
se interpretará en modo estricto. La palabra alcance léxico es importante aquí. Por ejemplo, si tu estricto el código llama a una función de una biblioteca que es no estricta, solo su código se ejecuta en modo estricto, y no la función llamada. Ver esta respuesta para una mejor explicación.
¿Qué cosas están prohibidas en modo estricto?
Me encontré con un buen artículo describiendo varias cosas que están prohibidas en modo estricto (tenga en cuenta que esta no es una lista exclusiva):
Alcance
Históricamente, JavaScript se ha confundido sobre cómo se definen las funciones. A veces parecen tener un alcance estático, pero algunas características hacen que se comporten como si tuvieran un alcance dinámico. Esto es confuso y dificulta la lectura y la comprensión de los programas. El malentendido causa errores. También es un problema de rendimiento. El alcance estático permitiría que se produzca el enlace de variables en tiempo de compilación, pero el requisito de alcance dinámico significa que el enlace debe posponerse al tiempo de ejecución, lo que conlleva una penalización de rendimiento significativa.
El modo estricto requiere que toda la vinculación de variables se realice de forma estática. Eso significa que las características que anteriormente requerían un enlace dinámico deben eliminarse o modificarse. Específicamente, la instrucción with se elimina y la capacidad de la función eval para alterar el entorno de su llamador está severamente restringida.
Uno de los beneficios del código estricto es que herramientas como Compresor YUI puede hacer un mejor trabajo al procesarlo.
Variables globales implícitas
JavaScript tiene variables globales implícitas. Si no declara explícitamente una variable, se declara implícitamente una variable global. Esto facilita la programación para los principiantes porque pueden descuidar algunas de sus tareas domésticas básicas. Pero dificulta mucho la administración de programas más grandes y degrada significativamente la confiabilidad. Entonces, en modo estricto, las variables globales implícitas ya no se crean. Debe declarar explícitamente todas sus variables.
Fuga global
Hay una serie de situaciones que pueden causar
this
estar vinculado al objeto global. Por ejemplo, si olvida proporcionar elnew
prefijo al llamar a una función de constructor, el constructorthis
se vinculará inesperadamente al objeto global, por lo que en lugar de inicializar un nuevo objeto, manipulará silenciosamente las variables globales. En estas situaciones, el modo estricto enlazaráthis
aundefined
, lo que hará que el constructor lance una excepción en su lugar, permitiendo que el error se detecte mucho antes.Fallo ruidoso
JavaScript siempre ha tenido propiedades de solo lectura, pero no podía crearlas usted mismo hasta que ES5
Object.createProperty
función expuso esa capacidad. Si intentara asignar un valor a una propiedad de solo lectura, fallaría silenciosamente. La asignación no cambiaría el valor de la propiedad, pero su programa continuaría como si lo hubiera hecho. Este es un peligro para la integridad que puede hacer que los programas entren en un estado inconsistente. En modo estricto, intentar cambiar una propiedad de solo lectura generará una excepción.Octal
La representación octal (o base 8) de números fue extremadamente útil al realizar programación a nivel de máquina en máquinas cuyo tamaño de palabra era un múltiplo de 3. Necesitaba octal cuando trabajaba con el mainframe CDC 6600, que tenía un tamaño de palabra de 60 bits. Si pudieras leer octal, podrías considerar una palabra como 20 dígitos. Dos dígitos representan el código de operación y un dígito identifica uno de los 8 registros. Durante la lenta transición de códigos de máquina a lenguajes de alto nivel, se pensó que era útil proporcionar formas octales en lenguajes de programación.
En C, se seleccionó una representación extremadamente desafortunada de octalidad: el cero inicial. Entonces en C,
0100
significa 64, no 100, y08
es un error, no 8. Aún más desafortunadamente, este anacronismo se ha copiado en casi todos los lenguajes modernos, incluido JavaScript, donde solo se usa para crear errores. No tiene otro propósito. Entonces, en modo estricto, las formas octales ya no están permitidas.Etcétera
La pseudo matriz de argumentos se vuelve un poco más parecida a una matriz en ES5. En modo estricto, pierde su
callee
ycaller
propiedades. Esto hace posible pasar suarguments
a código que no es de confianza sin renunciar a mucho contexto confidencial. También elarguments
se elimina la propiedad de las funciones.En modo estricto, las claves duplicadas en una función literal producirán un error de sintaxis. Una función no puede tener dos parámetros con el mismo nombre. Una función no puede tener una variable con el mismo nombre que uno de sus parámetros. Una función no puede
delete
sus propias variables. Un intento dedelete
una propiedad no configurable ahora lanza una excepción. Los valores primitivos no se envuelven implícitamente.
Palabras reservadas para futuras versiones de JavaScript
ECMAScript 5 agrega una lista de palabras reservadas. Si los usa como variables o argumentos, el modo estricto arrojará un error. Las palabras reservadas son:
implements
,interface
,let
,package
,private
,protected
,public
,static
yyield
OTRAS LECTURAS
respondido 27 nov., 19:06
140
Recomiendo encarecidamente a todos los desarrolladores que comiencen a usar el modo estricto ahora. Hay suficientes navegadores que lo admiten, por lo que el modo estricto nos ayudará legítimamente a salvarnos de errores que ni siquiera sabíamos que estaban en su código.
Aparentemente, en la etapa inicial habrá errores que nunca antes habíamos encontrado. Para obtener el beneficio completo, debemos realizar las pruebas adecuadas después de cambiar al modo estricto para asegurarnos de haber capturado todo. Definitivamente no solo tiramos use strict
en nuestro código y asumimos que no hay errores. Entonces, la pérdida es que es hora de comenzar a usar esta característica de lenguaje increíblemente útil para escribir 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 escaneará rápidamente en busca de problemas y errores notables en su código.
Respondido 25 Feb 16, 15:02
96
Me gustaría ofrecer una respuesta algo más fundamentada que complemente las otras respuestas. Esperaba editar la respuesta más popular, pero fallé. Traté de hacerlo lo más completo y completo que pude.
Puede consultar el Documentación 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 consta de un literal de cadena especial (entre comillas simples o dobles). Los motores de JavaScript, que no implementan ECMAScript 5, simplemente ven una declaración de expresión sin efectos secundarios. Se espera que las versiones futuras de los estándares ECMAScript introduzcanuse
como palabra clave real; por tanto, las citas quedarían obsoletas.use strict
sólo se puede utilizar al principio de un script o de una función, es decir, debe preceder a cualquier otra declaración (real). No tiene que ser la primera instrucción en un script de función: puede ir precedida de otras expresiones de declaración que consistan en cadenas literales (y las implementaciones de JavaScript pueden tratarlas como directivas específicas de implementación). Las declaraciones de cadenas literales, que siguen a una primera declaración real (en un script o función) son declaraciones de expresión simples. Los intérpretes no deben interpretarlos como directivas y no tienen ningún efecto.
El use strict
La directiva 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 un use strict
directiva. El contenido de una función se considera código estricto cuando la función en sí está definida en un código estricto o cuando la función contiene una use strict
directiva. Código que se pasa a un eval()
El método se considera código estricto cuando eval()
fue llamado desde un código estricto o contiene el use strict
directiva 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 verificació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 puedes usar el
with
-enunciado en modo estricto. - En modo estricto, todas las variables deben declararse: si asigna un valor a un identificador que no ha sido declarado como variable, función, parámetro de función, parámetro de cláusula de captura o propiedad de la global
Object
, entonces obtendrás unReferenceError
. En el modo normal, el identificador se declara implícitamente como una variable global (como una propiedad de la globalObject
) - En modo estricto, la palabra clave
this
tiene el valorundefined
en funciones que fueron invocadas como funciones (no como métodos). (En modo normalthis
siempre apunta a lo globalObject
). Esta diferencia se puede utilizar para probar si una implementación admite el modo estricto:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
Además, cuando se invoca una función con
call()
orapply
en modo estricto, entoncesthis
es exactamente el valor del primer argumento de lacall()
orapply()
invocación. (En modo normalnull
yundefined
son reemplazados por el globalObject
y los valores, que no son objetos, se convierten en objetos).En modo estricto obtendrá un
TypeError
, cuando intenta asignar a propiedades de solo lectura o definir nuevas propiedades para un objeto no extensible. (En modo normal, ambos simplemente fallan sin mensaje de error).- En modo estricto, al pasar código a
eval()
, no puede declarar o definir variables o funciones en el alcance de la persona que llama (como puede hacerlo en modo normal). En cambio, se crea un nuevo alcance paraeval()
y las variables y funciones están dentro de ese alcance. Ese alcance se destruye despuéseval()
termina la ejecución. - En modo estricto, el objeto-argumentos de una función contiene una copia estática de los valores, que se pasan a esa función. En el modo normal, el objeto-argumentos tiene un comportamiento algo "mágico": los elementos de la matriz y los parámetros de la función nombrada hacen referencia a ambos al mismo valor.
- En modo estricto obtendrá un
SyntaxError
cuandodelete
El operador va seguido de un identificador no calificado (una variable, función o parámetro de función). En modo normal eldelete
expresión no haría nada y se evalúa parafalse
. - En modo estricto obtendrá un
TypeError
cuando intenta eliminar una propiedad no configurable. (En modo normal, el intento simplemente falla y eldelete
la expresión se evalúa parafalse
). - En modo estricto se considera un error sintáctico cuando intenta definir varias propiedades con el mismo nombre para un objeto literal. (En modo normal no hay error).
- En modo estricto se considera un error sintáctico cuando la declaración de una función tiene varios parámetros con el mismo nombre. (En modo normal no hay error).
- En modo estricto, no se permiten literales octales (estos son literales que comienzan con
0x
. (En modo normal, algunas implementaciones permiten literales octales). - En modo estricto, los identificadores
eval
yarguments
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 sobre las posibilidades de examinar la pila de llamadas.
arguments.caller
yarguments.callee
porque unTypeError
en una función en modo estricto. Además, algunas propiedades de llamada y argumentos de funciones en modo estricto provocan unaTypeError
cuando intentas leerlos.
Respondido 12 Jul 15, 21:07
"En el modo estricto, los literales octales no están permitidos (estos son literales que comienzan con 0x ...)", los literales octales comienzan con un encabezado 0
. - Alex Gittemeier
85
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 un comportamiento silencioso y extraño de su página web. El momento 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 variable global:
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 alcance global al que se puede acceder utilizando window.nameoftree
. Cuando implementamos use strict
el código arrojaría error.
Error de referencia no detectado: nameoftree no está definido
elimina with
declaración :
with
las declaraciones no se pueden minimizar con herramientas como feo-js. Ellos también son y eliminado de futuras versiones de JavaScript.
Evita los duplicados:
Cuando tenemos una propiedad duplicada, lanza una excepción
Error de sintaxis no detectado: la propiedad de datos duplicados en el objeto literal no está permitida en el modo estricto
"use strict";
var tree1Data = {
name: 'Banana Tree',
age: 100,
leafCount: 100000,
name:'Banana Tree'
};
Hay algunos más, pero necesito adquirir más conocimientos al respecto.
Respondido 21 Oct 14, 14:10
65
Si utiliza un navegador lanzado en el último año, lo más probable es que admita el modo estricto de JavaScript. Solo los navegadores más antiguos antes de que ECMAScript 5 se convirtiera en el estándar actual no lo admiten.
Las comillas alrededor del comando aseguran que el código también funcionará en navegadores más antiguos (aunque las cosas que generan un error de sintaxis en modo estricto generalmente solo harán que el script funcione mal de alguna manera difícil de detectar en esos navegadores más antiguos).
respondido 10 mar '12, 03:03
60
Al agregar "use strict";
, los siguientes casos arrojarán un Error de sintaxis antes de que se ejecute el script:
Allanando el camino para futuras versiones de ECMAScript, utilizando una de las palabras clave recientemente reservadas (en previsión de ECMAScript 6):
implements
,interface
,let
,package
,private
,protected
,public
,static
yyield
.Declaración de función en bloques
if(a<b){ function f(){} }
Sintaxis octal
var n = 023;
this
apuntar al objeto global.function f() { "use strict"; this.a = 1; }; f();
Declarar dos veces el mismo nombre para un nombre de propiedad en un objeto literal
{a: 1, b: 3, a: 7}
Este ya no es el caso en ECMAScript 6 (error 1041128).
Declarar dos argumentos de función con el mismo nombre función
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();
Usar
delete
en un nombre de variabledelete myVariable;
Usar
eval
orarguments
como nombre de argumento de variable o función"use strict"; arguments++; var obj = { set p(arguments) { } }; try { } catch (arguments) { } function arguments() { }
Fuentes:
Transición al modo estricto en MDN
Modo estricto en MDN
El modo estricto de JavaScript y por qué debería usarlo en el blog de Colin J. Ihrig (versión archivada)
Respondido 24 Oct 17, 11:10
¡Con ECMAScript 2015 se permiten de nuevo nombres de propiedad duplicados! Ver Documentación MDN. - Philmcole
55
El modo estricto realiza varios cambios en la semántica normal de JavaScript:
elimina algunos errores silenciosos de JavaScript cambiándolos para que arrojen errores.
corrige errores que dificultan que los motores JavaScript realicen optimizaciones.
prohíbe alguna sintaxis que probablemente se definirá en versiones futuras de ECMAScript.
para más información visite Modo estricto: Javascript
Respondido 29 Oct 14, 17:10
54
"Usar estricto"; es un seguro de que el programador no utilizará las propiedades sueltas o malas de JavaScript. Es una guía, al igual que una regla te ayudará a trazar líneas rectas. "Use Strict" le ayudará a realizar una "codificación directa".
Aquellos que prefieren no usar reglas para hacer sus líneas rectas generalmente terminan en esas páginas pidiendo a otros que depuren su código.
Créame. La sobrecarga es insignificante en comparación con el código mal diseñado. Doug Crockford, que ha sido desarrollador senior de JavaScript durante 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 que el modo "estricto" sea opcional es permitir que los codificadores menos experimentados accedan a JavaScript y darles tiempo para adaptarse a las nuevas y más seguras prácticas de codificación.
Respondido 26 Oct 14, 10:10
48
Incluye use strict
al comienzo de todos sus archivos JavaScript sensibles a partir de este punto, hay una pequeña forma de ser un mejor programador de JavaScript y evitar que las variables aleatorias se vuelvan globales y las cosas cambien silenciosamente.
Respondido 25 Feb 16, 15:02
43
La Directiva de "uso estricto"
La directiva "use 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.
El propósito de "usar estricto" es indicar que el código debe ejecutarse en "modo estricto".
Con el modo estricto, no puede, por ejemplo, utilizar variables no declaradas.
¿Por qué el modo estricto?
El modo estricto facilita la escritura de JavaScript "seguro".
El modo estricto cambia la "sintaxis incorrecta" previamente aceptada en errores reales.
Como ejemplo, en JavaScript normal, escribir mal un nombre de variable crea 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 al asignar valores a propiedades que no se pueden escribir.
En modo estricto, cualquier asignación a una propiedad no modificable, una propiedad de solo captador, una propiedad no existente, una variable no existente o un objeto no existente, arrojará un error.
Por favor, consulta nuestra http://www.w3schools.com/js/js_strict.asp para saber mas
Respondido 13 ago 18, 04:08
37
"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 arrojan errores fatales, es mejor usarlo siempre para hacer un código más ordenado.
"use strict"
es muy necesario para su uso en ECMA5, en ECMA6 es parte de JavaScript de forma predeterminada, 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 "use 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. El propósito de "usar estricto" es indicar que el código debe ejecutarse en "modo estricto". Con el modo estricto, no puede, por ejemplo, utilizar variables no declaradas.Ejemplos de uso de "use estricto":
Modo estricto para funciones: Del mismo modo, para invocar el modo estricto para una función, ponga la declaración exacta "use estricto"; (o 'use 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 todo el script
'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);
3) Asignación a un global no modificable
'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
solicite leer más en MDN.
Respondido 30 ago 18, 16:08
31
Hay una buena charla de algunas personas que estaban en el comité de ECMAScript: Cambios en JavaScript, Parte 1: ECMAScript 5 " sobre cómo el uso incremental de la "use strict"
Switch 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 habla de cuántas de esas fallas son (eran) y cómo ECMAScript 5 las corrige.
respondido 29 mar '14, 19:03
26
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
respondido 18 nov., 18:16
19
Tenga en cuenta que use strict
fue introducido 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 de directiva que contiene una Directiva de uso estricto (consulte 14.1.1).
- El código del módulo es siempre un código de modo estricto.
- Todas las partes de un Declaración de clase o un expresión de clase son un código de modo estricto.
- El código de evaluación es un código de modo estricto si comienza con un prólogo de directiva 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 un código de modo estricto.
- El código de función es un código de modo estricto si el FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition o ArrowFunction está contenido en un código de modo estricto o si el código que produce el valor de la ranura interna [[ECMAScriptCode]] de la función comienza con un Prólogo de directiva que contiene una directiva de uso estricto.
- El código de función que se proporciona como argumentos a los constructores integrados de Función y Generador es un código de modo estricto si el último argumento es una Cadena que cuando se procesa es una FunciónCuerpo que comienza con un Prólogo de la directiva que contiene una directiva estricta de uso.
Respondido 12 Abr '16, 01:04
14
Las principales razones por las que los desarrolladores deberían utilizar "use strict"
son:
Evita la declaración accidental de variables globales.
"use strict()"
se asegurará de que las variables se declaren convar
antes de usar. P.ej:function useStrictDemo(){ 'use strict'; //works fine var a = 'No Problem'; //does not work fine and throws error k = "problem" //even this will throw error someObject = {'problem': 'lot of problem'}; }
- NB: El
"use strict"
La directiva solo se reconoce al comienzo de un script o una función. La cuerda
"arguments"
no se puede utilizar como variable:"use strict"; var arguments = 3.14; // This will cause an error
Restringirá el uso de palabras clave como variables. Intentar 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 leer más al respecto, puede consultar aquí.
Respondido el 18 de junio de 17 a las 04:06
13
El modo "estricto" de JavaScript se introdujo en ECMAScript 5.
(function() {
"use strict";
your code...
})();
Escribiendo "use strict";
en la parte superior de su archivo JS activa la comprobación de sintaxis estricta. Realiza las siguientes tareas por nosotros:
muestra un error si intenta asignar a una variable no declarada
evita que sobrescriba las bibliotecas clave del sistema JS
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 "use" están destinadas a ser compatibles con versiones anteriores. Los navegadores que no los admitan solo verán un literal de cadena al que no se hace referencia adicional. Entonces, lo pasarán por alto y seguirán adelante.
Respondido 06 Feb 19, 09:02
13
use strict
es una forma de hacer que su código sea más seguro, porque no puede usar características peligrosas que pueden funcionar no como espera. Y, como se escribió antes, hace que el código sea más estricto.
Respondido el 13 de enero de 20 a las 14:01
12
"uso estricto"; es el esfuerzo de ECMA para hacer que JavaScript sea un poco más robusto. Trae a JS un intento de hacerlo al menos un poco "estricto" (otros lenguajes implementan reglas estrictas desde los años 90). En realidad, "obliga" a los desarrolladores de JavaScript a seguir algún tipo de mejores prácticas de codificación. Aún así, JavaScript es muy frágil. No existen variables escritas, métodos escritos, 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 depurar.
Respondido el 15 de junio de 16 a las 00:06
12
Normalmente, JavaScript no sigue reglas estrictas, por lo que aumentan 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, declaración antes de la inicialización, etc.
If "use strict"
se utiliza, el código debe escribirse siguiendo un conjunto estricto de reglas, disminuyendo así las posibilidades de errores y ambigüedades.
Respondido el 04 de enero de 19 a las 02:01
11
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:
Previene globales accidentales
Sin duplicados
Elimina con
Elimina esta coerción.
Eval () más seguro
Errores para inmutables
también puedes leer esto artículo para los detalles
Respondido 17 Oct 16, 15:10
7
"uso estricto"; Define que el código JavaScript debe ejecutarse en "modo estricto".
- La directiva de "uso estricto" era nueva en ECMAScript versión 5.
- No es una declaración, sino una expresión literal, ignorada por versiones anteriores de JavaScript.
- El propósito de "usar estricto" es indicar que el código debe ejecutarse en "modo estricto".
- Con el modo estricto, no puede, por ejemplo, utilizar variables no declaradas.
Todos los navegadores modernos admiten "uso estricto" excepto Internet Explorer 9 y versiones anteriores.
Desventaja
Si un desarrollador usó una biblioteca que estaba en modo estricto, pero el desarrollador estaba acostumbrado a trabajar en modo normal, podría llamar a algunas acciones en la biblioteca que no funcionarían como se esperaba.
Peor aún, dado que el desarrollador está en modo normal, no tiene las ventajas de que se produzcan errores adicionales, por lo que el error puede fallar silenciosamente.
Además, como se mencionó anteriormente, el modo estricto le impide hacer ciertas cosas.
La gente generalmente piensa que no debería 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.
Para obtener un ejemplo básico y como referencia, consulte:
https://www.tutorialsteacher.com/javascript/javascript-strict
Respondido 19 Jul 19, 13:07
4
El modo estricto puede evitar pérdidas de memoria.
Verifique la función a continuación 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 primero verificará si hay alguna variable declarada con ese nombre en particular en el alcance de esa función en particular. Dado que el compilador entendió que no existe tal variable, verificará el alcance externo. En nuestro caso, es el ámbito global. Una vez más, el compilador entendió que tampoco hay ninguna variable declarada en el espacio global con ese nombre, por lo que nos crea esa variable 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, digamos, la variable se declara en una función secundaria. En ese caso, el compilador verifica la validez de esa variable en el ámbito externo, es decir, la función padre. Solo entonces comprobará el espacio global y creará una variable para nosotros allí. Eso significa que es necesario realizar comprobaciones adicionales. Esto afectará el rendimiento de la aplicación.
Ahora escribamos la misma función en modo estricto.
"use strict"
function getname(){
name = "Stack Overflow"; // Not using var keyword
return name;
}
getname();
console.log(name);
Obtendremos el siguiente error.
Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5
Aquí, el compilador arroja el error de referencia. En modo estricto, el compilador no nos permite usar la variable sin declararla. Así se pueden prevenir las pérdidas de memoria. Además, podemos escribir código más optimizado.
Respondido 09 Jul 19, 07:07
2
El modo estricto elimina los errores que se ignorarían en el modo no estricto, lo que hace que JavaScript sea "más seguro".
¿Se considera una de las mejores prácticas?
Sí, Se considera parte de las mejores prácticas al trabajar con javascript para incluir Modo estricto. Esto se hace agregando la siguiente línea de código en su archivo JS.
'use strict';
en su código.
¿Qué significa para los agentes de usuario?
La indicación de que el código debe interpretarse en modo estricto especifica a los agentes de usuario, como los navegadores, que deben tratar el código literalmente como está escrito y generar un error si el código no tiene sentido.
Por ejemplo: Considere en su .js
archivo tienes el siguiente código:
Escenario 1: [SIN MODO ESTRICTO]
var city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago
Escenario 2: [SIN MODO ESTRICTO]
city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago
Entonces, ¿por qué se imprime el nombre de la variable en ambos casos?
Sin el modo estricto activado, los agentes de usuario a menudo pasan por una serie de modificaciones en el código problemático en un intento de hacer que tenga sentido. En la superficie, esto puede parecer algo bueno y, de hecho, trabajar fuera del modo estricto hace posible que las personas se mojen los pies con el código JavaScript sin tener todos los detalles bien definidos. Sin embargo, como desarrollador, no quiero dejar un error en mi código, porque sé que podría volver y morderme más adelante, y también solo quiero escribir un buen código. Y ahí es donde el modo estricto ayuda.
Escenario 3: [MODO ESTRICTO]
'use strict';
city = "Chicago"
console.log(city) // Reference Error: asignment is undeclared variable city.
Consejo adicional: Para mantener la calidad del código usando el modo estricto, no necesita escribir esto una y otra vez, especialmente si tiene múltiples .js
expediente. Puede hacer cumplir esta regla a nivel mundial en eslint
reglas de la siguiente manera:
Nombre del archivo: .eslintrc.js
module.exports = {
env: {
es6: true
},
rules : {
strict: ['error', 'global'],
},
};
Bien, entonces, ¿qué se previene en modo estricto?
Usar una variable sin declararla arrojará un error en modo estricto. Esto es para evitar la creación involuntaria de variables globales en toda su aplicación. El ejemplo de la imprenta Chicago cubre esto en particular.
Eliminar una variable, una función o un argumento es un no-no en modo estricto.
"use strict"; function x(p1, p2) {}; delete x; // This will cause an error
Duplicar un nombre de parámetro is no permitido en modo estricto.
"use strict"; function x(p1, p1) {}; // This will cause an error
No se permiten palabras reservadas en el idioma Javascript. en modo estricto. Las palabras son interfaz de implementos, dejar, paquetes, privado, protegido, público. estático y rendimiento
Para obtener una lista más completa, consulte la documentación de MDN aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode
Respondido 10 Jul 20, 08:07
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas javascript syntax jslint use-strict or haz tu propia pregunta.
Las respuestas aquí son antiguas pero incorrectas. El principal razonamiento para el modo estricto no fue evitar errores de programación, sino hacer que JavaScript tuviera un alcance léxico para que pudiera ser analizable estáticamente:] - Benjamin Gruenbaum