statement - ¿Qué hace "uso estricto" en JavaScript, y cuál es el razonamiento detrás de esto?
use strict que es (25)
Usando ''use strict'';
de repente no mejora tu código.
El modo estricto de JavaScript es una característica en ECMAScript 5 . Puede habilitar el modo estricto declarando esto en la parte superior de su script / función.
''use strict'';
Cuando un motor de JavaScript ve esta directiva , comenzará a interpretar el código en un modo especial. En este modo, se generan errores cuando se detectan ciertas prácticas de codificación que podrían terminar siendo errores potenciales (que es el razonamiento detrás del modo estricto).
Considera este ejemplo:
var a = 365;
var b = 030;
En su obsesión por alinear los literales numéricos, el desarrollador ha inicializado inadvertidamente la variable b
con un octal literal. El modo no estricto interpretará esto como un literal numérico con valor 24
(en base 10). Sin embargo, el modo estricto arrojará un error.
Para obtener una lista no exhaustiva de especialidades en modo estricto, consulte esta respuesta .
¿Dónde debo usar ''use strict'';
?
En mi nueva aplicación de JavaScript: ¡Absolutamente! El modo estricto se puede usar como denunciante cuando estás haciendo algo estúpido con tu código.
En mi código JavaScript existente : ¡ Probablemente no! Si su código JavaScript existente tiene declaraciones que están prohibidas en modo estricto, la aplicación simplemente se romperá. Si desea un modo estricto, debe estar preparado para depurar y corregir su código existente. Es por esto que usar
''use strict'';
de repente no mejora tu código .
¿Cómo uso el modo estricto?
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 función de cuerpo:function doSomething() { ''use strict''; ... }
Todo en el ámbito léxico de la función
doSomething
se interpretará en modo estricto. La palabra ámbito léxico es importante aquí. Vea esta respuesta para una mejor explicación.
¿Qué cosas están prohibidas en modo estricto?
Encontré un buen artículo que describe varias cosas que están prohibidas en modo estricto (tenga en cuenta que esta no es una lista exclusiva):
Alcance
Históricamente, JavaScript se ha confundido acerca de cómo se ajustan las funciones de las funciones. A veces, parecen tener un alcance estático, pero algunas características hacen que se comporten como si estuvieran con un alcance dinámico. Esto es confuso, haciendo que los programas sean difíciles de leer y entender. El malentendido causa errores. También es un problema para el rendimiento. El alcance estático permitiría que la vinculación variable ocurra en el momento de la compilación, pero el requisito de alcance dinámico significa que la vinculación debe aplazarse hasta el tiempo de ejecución, lo que conlleva una penalización de rendimiento significativa.
El modo estricto requiere que todas las variables se realicen de forma estática. Eso significa que las características que anteriormente requerían el enlace dinámico deben eliminarse o modificarse. Específicamente, se elimina la instrucción with, y la capacidad de la función eval para manipular el entorno de su interlocutor está severamente restringida.
Uno de los beneficios del código estricto es que las herramientas como YUI Compressor pueden hacer un mejor trabajo al procesarlo.
Variables globales implícitas
JavaScript ha implicado variables globales. Si no declara explícitamente una variable, una variable global se declara implícitamente para usted. Esto facilita la programación para los principiantes, ya que pueden descuidar algunas de sus tareas básicas de limpieza. Pero hace que la administración de programas más grandes sea mucho más difícil y degrada significativamente la confiabilidad. Entonces, en modo estricto, las variables globales implícitas ya no se crean. Debes declarar explícitamente todas tus variables.
Fuga global
Hay una serie de situaciones que podrían hacer que
this
se vincule al objeto global. Por ejemplo, si olvida proporcionar elnew
prefijo al llamar a una función de constructor, el constructor estará vinculado de forma inesperada al objeto global, por lo que en lugar de inicializar un nuevo objeto, estará manipulando silenciosamente las variables globales. En estas situaciones, el modo estricto en cambio enlazaráthis
conundefined
, lo que hará que el constructor emita una excepción, permitiendo que el error se detecte mucho antes.Falla ruidosa
JavaScript siempre ha tenido propiedades de solo lectura, pero no pudo crearlas usted mismo hasta que la función
Object.createProperty
de ES5 expusiera esa capacidad. Si intentara asignar un valor a una propiedad de solo lectura, fallaría en silencio. La asignación no cambiaría el valor de la propiedad, pero su programa procederá como si lo hubiera hecho. Este es un peligro para la integridad que puede hacer que los programas pasen a un estado inconsistente. En modo estricto, intentar cambiar una propiedad de solo lectura generará una excepción.Octal
La representación de números en octal (o base 8) fue extremadamente útil al realizar la programación a nivel de máquina en máquinas cuyo tamaño de palabra era un múltiplo de 3. Necesitaba octal cuando trabajaba con el mainframe CDC 6600, que tenía un tamaño de palabra de 60 bits. Si pudieras leer octal, podrías ver una palabra como 20 dígitos. Dos dígitos representaron el código de operación y un dígito identificó uno de los 8 registros. Durante la lenta transición de los códigos de máquina a los lenguajes de alto nivel, se pensó que era útil proporcionar formas octales en los lenguajes de programación.
En C, se seleccionó una representación extremadamente desafortunada de la octalidad: Cero inicial. Entonces, en C,
0100
significa 64, no 100, y08
es un error, no 8. Incluso más desafortunadamente, este anacronismo se ha copiado en casi todos los idiomas modernos, incluido JavaScript, donde solo se utiliza para crear errores. No tiene otro propósito. Así que en modo estricto, las formas octales ya no están permitidas.Etcétera
Los argumentos pseudo array se vuelven un poco más parecidos a array en ES5. En modo estricto, pierde sus propiedades de
caller
ycaller
. Esto hace posible pasar susarguments
a un código no confiable sin renunciar a una gran cantidad de contexto confidencial. Además, se elimina la propiedad dearguments
de funciones.En modo estricto, las claves duplicadas en un literal de función producirán un error de sintaxis. Una función no puede tener dos parámetros con el mismo nombre. Una función no puede tener una variable con el mismo nombre que uno de sus parámetros. Una función no puede
delete
sus propias variables. Un intento dedelete
una propiedad no configurable ahora lanza una excepción. Los valores primitivos no están envueltos implícitamente.
Palabras reservadas para futuras versiones de JavaScript
ECMAScript 5 agrega una lista de palabras reservadas. Si los utiliza como variables o argumentos, el modo estricto generará un error. Las palabras reservadas son:
implements
,interface
,let
,package
,private
,protected
,public
,static
, yyield
Otras lecturas
Recientemente, ejecuté parte de mi código JavaScript a través de JSLint de Crockford, y dio el siguiente error:
Problema en la línea 1 carácter 1: Falta una declaración de "uso estricto".
Haciendo algunas búsquedas, me di cuenta de que algunas personas añaden "use strict";
en su código de JavaScript. Una vez que agregué la declaración, el error dejó de aparecer. Desafortunadamente, Google no reveló gran parte de la historia detrás de esta declaración de cadena. Ciertamente, debe tener algo que ver con la forma en que el navegador interpreta el JavaScript, pero no tengo idea de cuál sería el efecto.
Entonces, ¿qué es "use strict";
En general, ¿qué implica, y sigue siendo relevante?
¿Alguno de los navegadores actuales responde al "use strict";
cadena o es para uso futuro?
Al agregar "use strict";
, los siguientes casos lanzarán un SyntaxError antes de que se ejecute el script:
Allanando el camino para futuras versiones de ECMAScript , utilizando una de las palabras clave recién reservadas (en previsión para ECMAScript 6 ):
implements
,interface
,let
,package
,private
,protected
,public
,static
, yyield
.Declarando la función en bloques.
if(a<b){ function f(){} }
Sintaxis octal
var n = 023;
this
apunta al objeto global.function f() { "use strict"; this.a = 1; }; f();
Declarar dos veces el mismo nombre para un nombre de propiedad en un objeto literal
{a: 1, b: 3, a: 7}
Este ya no es el caso en ECMAScript 6 ( error 1041128 ).
Declarando dos argumentos de función con la misma función de nombre
f(a, b, b){}
Establecer un valor para una variable no declarada
function f(x){ "use strict"; var a = 12; b = a + x*35; // error! } f();
Usando
delete
en un nombre de variabledelete myVariable;
Usando
eval
oarguments
como variable o función nombre de argumento"use strict"; arguments++; var obj = { set p(arguments) { } }; try { } catch (arguments) { } function arguments() { }
Fuentes:
Transición a modo estricto en MDN
Modo estricto en MDN
Modo estricto de JavaScript y por qué debería usarlo en el blog de Colin J. Ihrig (versión archivada)
El modo estricto realiza varios cambios en la semántica normal de JavaScript:
elimina algunos errores silenciosos de JavaScript al cambiarlos para lanzar errores.
corrige errores que dificultan que los motores de JavaScript realicen optimizaciones.
prohíbe cierta sintaxis que pueda definirse en futuras versiones de ECMAScript.
Para más información visite Modo Estricto- Javascript.
Es una nueva característica de ECMAScript 5. John Resig escribió un buen resumen de este.
Es solo una cadena que colocas en tus archivos JavaScript (ya sea en la parte superior de tu archivo o dentro de una función) que se ve así:
"use strict";
Ponerlo en su código ahora no debería causar ningún problema con los navegadores actuales, ya que es solo una cadena. Puede causar problemas con su código en el futuro si su código viola el pragma. Por ejemplo, si actualmente tiene foo = "bar"
sin definir primero foo
, su código empezará a fallar ... lo cual, en mi opinión, es bueno.
Este artículo sobre el Modo estricto de Javascript podría interesarle: John Resig - Modo estricto ECMAScript 5, JSON y más
Para citar algunas partes interesantes:
El Modo estricto es una nueva función en ECMAScript 5 que le permite colocar un programa o una función en un contexto operativo "estricto". Este contexto estricto evita que se tomen ciertas acciones y lanza más excepciones.
Y:
El modo estricto ayuda de dos maneras:
- Atrapa algunos bloopers de codificación comunes, lanzando excepciones.
- Previene o arroja errores cuando se toman acciones relativamente "inseguras" (como obtener acceso al objeto global).
- Desactiva las funciones que son 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.
Actualmente, es compatible con todos los navegadores principales (barra IE 9 e inferior) .
La declaración "use strict";
indica al navegador que use el modo Estricto, que es un conjunto de funciones de JavaScript reducido y más seguro.
Lista de características (no exhaustiva)
No permite variables globales. (Coge las declaraciones de
var
y errores tipográficos en los nombres de variables)Las asignaciones fallidas silenciosas arrojarán un error en modo estricto (asignando
NaN = 5;
)Se intentarán eliminar las propiedades no
delete Object.prototype
(delete Object.prototype
)Requiere que todos los nombres de propiedades 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) {...}
)Sintaxis octal de Forbids (
var x = 023;
algunos desarrolladores asumen erróneamente que un cero anterior no hace nada para cambiar el número).Prohibe
with
palabra claveeval
en modo estricto no introduce nuevas variablesProhibir la eliminación de nombres sin formato (
delete x;
)Prohibir el enlace o la asignación de los nombres
eval
yarguments
en cualquier formaEl modo estricto no alia las propiedades del objeto de
arguments
con los parámetros formales. (es decir, en lafunction sum (a,b) { return arguments[0] + b;}
Esto funciona porque losarguments[0]
están vinculados a y así sucesivamente.)arguments.callee
no es compatible
[Ref: modo estricto , red de desarrolladores de Mozilla ]
Me gustaría ofrecer una respuesta algo más fundamentada que complemente las otras respuestas. Esperaba editar la respuesta más popular, pero fracasé. Traté de hacerlo lo más completo y completo posible.
Puede consultar la documentación de MDN para obtener más información.
"use strict"
una directiva introducida en ECMAScript 5.
Las directivas son similares a las declaraciones, pero diferentes.
-
use strict
no contiene palabras clave: la directiva es una declaración de expresión simple, que consiste en un literal de cadena especial (entre comillas simples o dobles). Los motores de JavaScript, que no implementan ECMAScript 5, simplemente ven una declaración de expresión sin efectos secundarios. Se espera que las versiones futuras de los estándares ECMAScript introduzcan eluse
como una palabra clave real; las citas se volverían obsoletas. -
use strict
se puede usar al principio de un script o de una función, es decir, debe preceder a cualquier otra declaración (real). No tiene que ser la primera instrucción en una secuencia de comandos de función: puede ir precedida por otras expresiones de instrucción que consisten en cadenas literales (y las implementaciones de JavaScript pueden tratarlas como directivas específicas de implementación). Las declaraciones literales de cadena, que siguen a una primera declaración real (en un script o función) son declaraciones de expresión simple. Los intérpretes no deben interpretarlos como directivas y no tienen ningún efecto.
La directiva de use strict
indica que el siguiente código (en un script o una función) es un código estricto. El código en el nivel más alto de un script (código que no está en una función) se considera código estricto cuando el script contiene una directiva de use strict
. El contenido de una función se considera código estricto cuando la función se define en un código estricto o cuando la función contiene una directiva de use strict
. El código que se pasa a un método eval()
se considera código estricto cuando se llamó a eval()
desde un código estricto o contiene la directiva de use strict
.
El modo estricto de ECMAScript 5 es un subconjunto restringido del lenguaje JavaScript, que elimina los déficits relevantes del lenguaje y presenta una comprobación de errores más estricta y una mayor seguridad. A continuación se enumeran las diferencias entre el modo estricto y el modo normal (de los cuales los tres primeros son particularmente importantes):
- No se puede usar la sentencia -st en modo estricto.
- En modo estricto, todas las variables deben declararse: si asigna un valor a un identificador que no se ha declarado como variable, función, parámetro de función, parámetro de cláusula catch o propiedad del
Object
global, obtendrá unReferenceError
. En el modo normal, el identificador se declara implícitamente como una variable global (como una propiedad delObject
global) - En modo estricto, la palabra clave tiene el valor
undefined
en funciones que se invocaron como funciones (no como métodos). (En el modo normal,this
siempre apunta alObject
global). Esta diferencia se puede usar para probar si una implementación admite el modo estricto:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
Además, cuando se invoca una función con
call()
o seapply
en modo estricto,this
es exactamente el valor del primer argumento de lacall()
oapply()
. (En el modo normal,null
yundefined
se reemplazan por elObject
global y los valores, que no son objetos, se convierten en objetos).En modo estricto obtendrá un
TypeError
, cuando intente asignar propiedades de solo lectura o definir nuevas propiedades para un objeto no extensible. (En el modo normal, ambos simplemente fallan sin mensaje de error).- En el modo estricto, al pasar el código a
eval()
, no puede declarar o definir variables o funciones en el alcance de la persona que llama (como puede hacerlo en el modo normal). En su lugar, se crea un nuevo ámbito paraeval()
y las variables y funciones están dentro de ese ámbito. Ese alcance se destruye después de queeval()
finalice la ejecución. - En modo estricto, el objeto-argumentos de una función contiene una copia estática de los valores, que se pasan a esa función. En el modo normal, el objeto-argumentos tiene un comportamiento algo "mágico": los elementos de la matriz y los parámetros de la función nombrados hacen referencia al mismo valor.
- En modo estricto, obtendrá un
SyntaxError
cuando el operador dedelete
va seguido de un identificador no calificado (una variable, función o parámetro de función). En el modo normal, la expresión dedelete
no haría nada y se evalúa comofalse
. - En modo estricto obtendrá un
TypeError
cuando intente eliminar una propiedad no configurable. (En el modo normal, el intento simplemente falla y la expresión dedelete
se evalúa comofalse
). - En modo estricto, se considera un error sintáctico cuando intenta definir varias propiedades con el mismo nombre para un objeto literal. (En el modo normal no hay error.)
- En modo estricto, se considera un error sintáctico cuando una declaración de función tiene múltiples parámetros con el mismo nombre. (En el modo normal no hay error.)
- En modo estricto, los literales octales no están permitidos (son literales que comienzan con
0x
. (En el modo normal, algunas implementaciones permiten los literales octales). - En modo estricto, los identificadores
eval
y losarguments
se tratan como palabras clave. No puede cambiar su valor, no puede asignarles un valor y no puede usarlos como nombres para variables, funciones, parámetros de función o identificadores de un bloque catch. - En modo estricto hay más restricciones sobre las posibilidades de examinar la pila de llamadas.
arguments.caller
yarguments.callee
causan unTypeError
en una función en modo estricto. Además, algunas propiedades de llamadas y argumentos de las funciones en modo estricto causan unTypeError
cuando intenta leerlas.
Recomiendo a todos los desarrolladores que empiecen a usar el modo estricto ahora. Hay suficientes navegadores que lo soportan que el modo estricto legítimamente ayudará a salvarnos de errores que ni siquiera sabíamos que estaban en su código.
Aparentemente, en la etapa inicial habrá errores que nunca hemos encontrado antes. Para obtener el beneficio completo, debemos realizar las pruebas adecuadas después de cambiar al modo estricto para asegurarnos de que hemos capturado todo. Definitivamente no solo lanzamos use strict
en nuestro código y asumimos que no hay errores. Entonces, la pérdida de tiempo 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 analizará rápidamente cualquier problema y error notables en su código.
Si a la gente le preocupa el use strict
, vale la pena leer este artículo:
Compatibilidad con el ''modo estricto'' de ECMAScript 5 en los navegadores. ¿Qué significa esto?
NovoGeek.com - El weblog de Krishna
Habla sobre el soporte del navegador, pero lo más importante es cómo manejarlo de manera segura:
function isStrictMode(){
return !this;
}
/*
returns false, since ''this'' refers to global object and
''!this'' becomes false
*/
function isStrictMode(){
"use strict";
return !this;
}
/*
returns true, since in strict mode the keyword ''this''
does not refer to global object, unlike traditional JS.
So here, ''this'' is ''undefined'' and ''!this'' becomes true.
*/
Si utiliza un navegador lanzado en el último año o más, entonces es muy probable que admita el modo estricto de JavaScript. Solo los navegadores antiguos antes de que ECMAScript 5 se convirtiera en el estándar actual no lo admiten.
Las citas en torno al comando aseguran que el código también funcionará en los navegadores más antiguos (aunque las cosas que generan un error de sintaxis en el modo estricto generalmente causarán que el script funcione mal de alguna manera difícil de detectar en esos navegadores antiguos).
Unas palabras de advertencia, todos los programadores de carga dura: ¡aplicar el "use strict"
al código existente puede ser peligroso! Esto no es una calcomanía que se sienta bien, que pueda pegar en el código para que sea "mejor". Con el pragma de "use strict"
, el navegador DEBE lanzar excepciones en lugares aleatorios que nunca lanzó antes simplemente porque en ese lugar usted está haciendo algo que el JavaScript predeterminado / suelto felizmente permite pero el JavaScript estricto aborrece. Es posible que haya infracciones estrictas que se ocultan en llamadas de uso poco frecuente en su código que solo generarán una excepción cuando finalmente se ejecuten, por ejemplo, en el entorno de producción que utilizan sus clientes de pago.
Si va a dar el paso, es una buena idea aplicar el "use strict"
junto con las pruebas unitarias integrales y una tarea de compilación JSHint estrictamente configurada que le dará cierta confianza de que no hay una esquina oscura de su módulo que explotará horriblemente solo porque has activado el modo estricto. O bien, aquí hay otra opción: simplemente no agregue "use strict"
a ninguno de sus códigos heredados, probablemente sea más seguro de esa manera, honestamente. DEFINITIVAMENTE NO agregue "use strict"
a los módulos que no posee o mantiene, como los módulos de terceros.
Creo que a pesar de que es un animal mortal enjaulado, el "use strict"
puede ser algo bueno, pero hay que hacerlo bien. El mejor momento para volverse estricto es cuando su proyecto es greenfield y usted comienza de cero. Configure JSHint/JSLint
con todas las advertencias y opciones ajustadas tan fuerte como su equipo pueda aguantar, obtenga un buen sistema de compilación / prueba / prueba du jour preparado como Grunt+Karma+Chai
, y solo ENTONCES comenzará a marcar todos sus nuevos módulos como "use strict"
. Esté preparado para curar muchos errores y advertencias molestos. Asegúrese de que todos entiendan la gravedad configurando la compilación en FAIL si JSHint/JSLint
produce alguna infracción.
Mi proyecto no era un proyecto greenfield cuando adopté "use strict"
. Como resultado, mi IDE está lleno de marcas rojas porque no tengo "use strict"
en la mitad de mis módulos, y JSHint se queja de eso. Es un recordatorio para mí sobre qué refactorización debo hacer en el futuro. Mi objetivo es estar libre de marcas rojas debido a todas mis declaraciones de "use strict"
faltan, pero eso es en años.
La directiva de "uso estricto"
La directiva de "uso estricto" es nueva en JavaScript 1.8.5 (ECMAScript versión 5).
No es una declaración, sino una expresión literal, ignorada por versiones anteriores de JavaScript.
El propósito de "uso estricto" es indicar que el código debe ejecutarse en "modo estricto".
Con el modo estricto, no puede, por ejemplo, usar variables no declaradas.
¿Por qué el modo estricto?
El modo estricto hace que sea más fácil escribir 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 generará 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 no grabables.
En modo estricto, cualquier asignación a una propiedad no grabable, una propiedad solo de captador, una propiedad no existente, una variable no existente o un objeto no existente generará un error.
Consulte http://www.w3schools.com/js/js_strict.asp para saber más
"use strict"
hace que el código JavaScript se ejecute en modo estricto , lo que básicamente significa que todo debe definirse antes de su uso. La razón principal para usar el modo estricto es evitar usos globales accidentales de métodos indefinidos.
También en modo estricto, las cosas se ejecutan más rápido, algunas advertencias o advertencias silenciosas producen errores fatales, es mejor usarlo siempre para hacer un código más ordenado.
"use strict"
es muy necesario para su uso en ECMA5, en ECMA6 es parte de JavaScript por defecto , por lo que no es necesario agregarlo si está usando ES6.
Mira estas declaraciones y ejemplos de MDN:
La directiva de
"uso estricto" La directiva de "uso estricto" es nueva en JavaScript 1.8.5 (ECMAScript versión 5). No es una declaración, sino una expresión literal, ignorada por versiones anteriores de JavaScript. El propósito de "uso estricto" es indicar que el código debe ejecutarse en "modo estricto". Con el modo estricto, no puede, por ejemplo, usar variables no declaradas.Ejemplos de uso de "uso estricto":
Modo estricto para funciones: Del mismo modo, para invocar el modo estricto para una función, coloque la declaración exacta "uso estricto"; (o ''use strict'';) 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 escritura completa
''use strict'';
var v = "Hi! I''m a strict mode script!";
console.log(v);
3) Asignación a un global no escribible
''use strict'';
// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError
// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, ''x'', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError
// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError
// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = ''ohai''; // throws a TypeError
Puedes leer más en MDN .
use strict
es una forma de hacer que su código sea más seguro, ya que no puede usar funciones peligrosas que pueden funcionar no como usted espera. Y como se escribió antes, hace que el código sea más estricto.
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 lanzando excepciones cuando ocurren ciertas cosas incorrectas que pueden causar un comportamiento silencioso y extraño de su página web. En el momento en que usamos el use strict
, el código arrojará errores que ayudarán al desarrollador a solucionarlo de antemano.
Pocas cosas importantes que he aprendido después de usar use strict
:
Previene la Declaración de la 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 el ámbito global al que se puede acceder utilizando window.nameoftree
. Cuando implementamos use strict
el código arrojaría un error.
Error de referencia no detectado: nameoftree no está definido
Elimina with
enunciado:
with
sentencias no se pueden minimizar usando herramientas como uglify-js . También están en deprecated y eliminados de futuras versiones de JavaScript.
Previene duplicados:
Cuando tenemos propiedad duplicada, lanza una excepción.
SyntaxError no capturado: propiedad de datos duplicados en objeto literal no permitido en modo estricto
"use strict";
var tree1Data = {
name: ''Banana Tree'',
age: 100,
leafCount: 100000,
name:''Banana Tree''
};
Hay pocos más, pero necesito obtener más conocimiento sobre eso.
El modo "estricto" de JavaScript se introduce en ECMAScript 5.
(function() {
"use strict";
your code...
})();
escribiendo "uso estricto"; en la parte superior de su archivo JS se activa la comprobación de sintaxis estricta. Realiza las siguientes tareas para nosotros:
(i) muestra un error si intenta asignar a una variable no declarada
(ii) le impide sobrescribir las bibliotecas del sistema de claves JS
(ii) prohíbe algunas características de lenguaje inseguras o propensas a errores
"uso estricto" también funciona dentro de funciones individuales. Siempre es una mejor práctica incluir "uso estricto en su código.
Problema de compatibilidad del navegador: las directivas de "uso" están diseñadas para ser compatibles con versiones anteriores. Los navegadores que no los admiten solo verán un literal de cadena al que no se hace referencia más. Entonces, lo pasarán por alto y seguirán adelante.
Pequeño ejemplo 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
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.
Evaluación más segura ()
Errores para inmutables.
También puedes leer este article para más detalles.
"Uso estricto"; es un seguro que el programador no utilizará las propiedades sueltas o malas de JavaScript. Es una guía, al igual que una regla le ayudará a hacer líneas rectas. "Usar estricto" te ayudará a hacer "Codificación directa".
Aquellos que prefieren no usar reglas para hacer sus líneas directamente terminan en esas páginas pidiendo a otros que depuren su código.
Créame. La sobrecarga es insignificante en comparación con el código mal diseñado. Doug Crockford, quien ha sido un 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 opcional el modo "Estricto" es permitir que los codificadores con menos experiencia accedan a JavaScript y dar tiempo para que se adapte a las nuevas y más seguras prácticas de codificación.
"uso estricto"; Es el esfuerzo de ECMA para hacer que JavaScript sea un poco más robusto. Trae a JS un intento de hacerlo al menos un poco "estricto" (otros lenguajes implementan reglas estrictas desde los años 90). En realidad, "obliga" a los desarrolladores de JavaScript a seguir algún tipo de buenas prácticas de codificación. Aún así, JavaScript es muy frágil. No hay variables tipificadas, métodos mecanografiados, etc. Recomiendo a los desarrolladores de JavaScript que aprendan un lenguaje más sólido como Java o ActionScript3, e implementen las mismas prácticas recomendadas en su código JavaScript. depurar.
Algunas personas que formaron parte del comité de ECMAScript hablan bien: Cambios en JavaScript, Parte 1: ECMAScript 5 " sobre cómo el uso incremental del "use strict"
conmutador permite a los implementadores de JavaScript limpiar muchas de las características peligrosas de JavaScript sin romper repentinamente todos los sitios web en el mundo.
Por supuesto, también habla de lo que muchos de esos errores son (eran) y de cómo ECMAScript 5 los corrige.
Incluir use strict
al comienzo de todos sus archivos JavaScript sensibles desde este punto es una pequeña forma de ser un mejor programador de JavaScript y evitar que las variables aleatorias se vuelvan globales y las cosas cambien en silencio.
Las principales razones por las que los desarrolladores deben usar "use strict"
son:
Previene la declaración accidental de variables globales . El uso
"use strict()"
asegurará que las variables se declarenvar
antes del uso. P.ej:function useStrictDemo(){ ''use strict''; //works fine var a = ''No Problem''; //does not work fine and throws error k = "problem" //even this will throw error someObject = {''problem'': ''lot of problem''}; }
- NB: la
"use strict"
directiva solo se reconoce al comienzo de un script o una función. La cadena
"arguments"
no se puede utilizar como una variable:"use strict"; var arguments = 3.14; // This will cause an error
Se restringirán los usos de palabras clave como variables. Tratar de usarlos arrojará errores.
En resumen, hará que su código sea menos propenso a errores y, a su vez, lo hará escribir un buen código.
Para leer más al respecto puedes consultar aquí .
Normalmente, el script java no sigue reglas estrictas, por lo tanto aumenta las posibilidades de errores. Después de usar "use strict"
, el código del script java debe seguir un conjunto estricto de reglas como en otros lenguajes de programación, como el uso de terminadores, la declaración antes de la inicialización, etc.
Si "use strict"
se utiliza, el código debe escribirse siguiendo un estricto conjunto de reglas, lo que reduce las posibilidades de errores y ambigüedades.
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 :
- El código global es código de modo estricto si comienza con un Prólogo Directivo que contiene una Directiva de Uso Estricto (ver 14.1.1).
- El código del módulo es siempre código de modo estricto.
- Todas las partes de una ClassDeclaration o una ClassExpression son códigos de modo estricto.
- El código de evaluación es un código de modo estricto si comienza con un Prólogo Directivo que contiene una Directiva de uso estricto o si la llamada a eval es una evaluación directa (ver 12.3.4.1) que está contenida en el código de modo estricto.
- El código de función es código de modo estricto si la función FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition o ArrowFunction está incluida en el código de modo estricto o si el código que produce el valor de la función [[ECMAScriptCode]] comienza con un Prólogo Directivo que contiene una directiva de uso estricto.
- El código de función que se suministra como los argumentos a los constructores incorporados de Función y Generador es un código de modo estricto si el último argumento es una Cadena que cuando se procesa es un FunctionBody que comienza con un Prólogo Directivo que contiene una Directiva de Uso Estricto.