Recientemente, ejecuté parte de mi código JavaScript a través de JSLint de Crockford , y me dio el siguiente error:
Problema en la línea 1, carácter 1: Falta la declaración "use estricto".
Al hacer algunas búsquedas, me di cuenta de que algunas personas agregan "use strict";
su código JavaScript. Una vez que agregué la declaración, el error dejó de aparecer. Desafortunadamente, Google no reveló gran parte de la historia detrás de esta declaración de cadena. Ciertamente debe tener algo que ver con la forma en que el navegador interpreta el JavaScript, pero no tengo idea de cuál sería el efecto.
Entonces, ¿de qué se "use strict";
trata, qué implica y sigue siendo relevante?
¿Alguno de los navegadores actuales responde a la "use strict";
cadena o es para uso futuro?
fuente
"use strict";
solo no hace que JS tenga un alcance léxico. Declarar variables conlet
y tambiénconst
debe usarse.Respuestas:
Este artículo sobre Javascript Strict Mode puede interesarle: John Resig - ECMAScript 5 Strict Mode, JSON y más
Para citar algunas partes interesantes:
Y:
También tenga en cuenta que puede aplicar el "modo estricto" a todo el archivo ... O puede usarlo solo para una función específica (todavía citando el artículo de John Resig) :
Lo que podría ser útil si tiene que mezclar código antiguo y nuevo ;-)
Entonces, supongo que es un poco como el
"use strict"
que puedes usar en Perl (¿de ahí el nombre?) : Te ayuda a cometer menos errores al detectar más cosas que podrían provocar roturas.El modo estricto ahora es compatible con todos los principales navegadores .
Dentro de los módulos nativos de ECMAScript (con
import
yexport
declaraciones) y clases de ES6 , el modo estricto siempre está habilitado y no se puede deshabilitar.fuente
"use strict"
en Firefox 3.6, Safari 5, Chrome 7 y Opera 10.6 (todos Mac). No hay errores de ningún tipo, así que supongo que 'usar estricto' aún no es compatible con ningún navegador. Sin embargo, no probé en IE9;)Es una nueva característica de ECMAScript 5. John Resig escribió un buen resumen del mismo.
Es solo una cadena que coloca en sus archivos JavaScript (ya sea en la parte superior de su archivo o dentro de una función) que se ve así:
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 definirfoo
primero, su código comenzará a fallar ... lo cual es algo bueno en mi opinión.fuente
<script>"use strict";
. La bandera solo se aplica al bloque en el que está incluida.'use strict';
lugar"use strict";
, fallará en su lugar. Esto tiene más sentido, porque si lo agrega al objeto global, eso significa que podría no funcionar la próxima vez que ejecute la función / haga otra cosa que restablezca el bloque, ya que estará en el bloque más alto (global).La declaración
"use strict";
indica al navegador que use el modo Estricto, que es un conjunto de funciones reducido y más seguro de JavaScript.Lista de características (no exhaustivas)
No permite variables globales. (Captura
var
declaraciones y errores tipográficos faltantes en nombres de variables)Las tareas fallidas silenciosas arrojarán errores en modo estricto (asignación
NaN = 5;
)Los intentos de eliminar propiedades no recuperables 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 la función deben ser únicos (
function sum (x, x) {...}
)Prohíbe la sintaxis octal (
var x = 023;
algunos desarrolladores suponen erróneamente que un cero anterior no hace nada para cambiar el número).Prohíbe la
with
palabra claveeval
en modo estricto no introduce nuevas variablesProhíbe eliminar nombres simples (
delete x;
)Prohíbe la vinculación o asignación de los nombres
eval
yarguments
en cualquier formaEl modo estricto no alias las propiedades del
arguments
objeto con los parámetros formales. (es decir, enfunction sum (a,b) { return arguments[0] + b;}
Esto funciona porquearguments[0]
está vinculado,a
etc.)arguments.callee
no es apoyado[Ref: Modo estricto , Red de desarrolladores de Mozilla ]
fuente
window.foo = bar
).Si a las personas les preocupa usar
use strict
, puede valer la pena leer este artículo:Compatibilidad con 'Modo estricto' de ECMAScript 5 en navegadores. ¿Qué significa esto?
NovoGeek.com - el weblog de Krishna
Habla sobre el soporte del navegador, pero lo más importante es cómo tratarlo de manera segura:
fuente
window
this
que no puedes apuntarwindow
?this
pertenece a su propia función y no a la ventana globalthis
uno es en realidadundefined
.Una advertencia: todos ustedes, programadores de carga dura: ¡aplicar
"use strict"
al código existente puede ser peligroso! Esta cosa no es una calcomanía para sentirse bien, una cara feliz que puede colocar en el código para que sea 'mejor'. Con el"use strict"
pragma, el navegador de repente LANZARÁ excepciones en lugares aleatorios que nunca arrojó antes solo porque en ese punto estás haciendo algo que JavaScript predeterminado / suelto permite felizmente, ¡pero aborrece estrictamente JavaScript! Es posible que tenga infracciones de rigurosidad ocultas en llamadas poco utilizadas en su código que solo arrojará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 de unidad integrales y una tarea de construcción JSHint estrictamente configurada que le dará cierta confianza de que no hay un rincón oscuro de su módulo que explotará horriblemente solo porque usted He activado el modo estricto. O, hey, 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 ningún módulo que no posea o mantenga, como los módulos de terceros.Creo que a pesar de que es un animal enjaulado mortal,
"use strict"
puede ser algo bueno, pero hay que hacerlo bien. El mejor momento para ser estricto es cuando su proyecto es totalmente nuevo y comienza desde cero. Realice la configuraciónJSHint/JSLint
con todas las advertencias y opciones tan ajustadas como su equipo pueda soportar, obtenga un buen sistema de construcción / prueba / afirmación del mismo modoGrunt+Karma+Chai
, y solo ENTONCES comience a marcar todos sus módulos nuevos como"use strict"
. Esté preparado para curar muchos errores y advertencias molestos. Asegúrese de que todos entiendan la gravedad configurando la compilación para FALLAR siJSHint/JSLint
produce alguna violación.Mi proyecto no era un proyecto nuevo cuando lo adopté
"use strict"
. Como resultado, mi IDE está lleno de marcas rojas porque no tengo la"use strict"
mitad de mis módulos, y JSHint se queja de eso. Es un recordatorio para mí sobre la refactorización que debo hacer en el futuro. Mi objetivo es estar libre de marcas rojas debido a todas mis"use strict"
declaraciones faltantes , pero eso está a años de distancia.fuente
"use strict";
código existente. Dicho esto, casi siempre lo uso cuando escribo un nuevo código desde ceroEl uso
'use strict';
no mejora repentinamente su código.El modo estricto de JavaScript es una característica de ECMAScript 5 . Puede habilitar el modo estricto declarándolo en la parte superior de su script / función.
Cuando un motor de JavaScript ve esta directiva , comenzará a interpretar el código en un modo especial. En este modo, se producen errores 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:
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 valor24
(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 nuevo aplicación de JavaScript: ¡Absolutamente! El modo estricto se puede utilizar 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 interrumpirá. Si desea un modo estricto, debe estar preparado para depurar y corregir su código existente. Esta es la razón por la que el uso
'use strict';
no mejora repentinamente su código .¿Cómo uso el modo estricto?
Insertar un
'use strict';
declaración en la parte superior de su script: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 del cuerpo de su función:Todo en el ámbito léxico de la función
doSomething
se interpretará en modo estricto. La palabra alcance léxico es importante aquí. Por ejemplo, si su código estricto llama a una función de una biblioteca que no es estricta , solo su código se ejecuta en modo estricto, y no la función llamada. Vea esta respuesta para una mejor explicación.¿Qué cosas están prohibidas en modo estricto?
Encontré un buen artículo describe varias cosas que están prohibidas en modo estricto (tenga en cuenta que esta no es una lista exclusiva):
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:
Otras lecturas
fuente
'use strict'
directiva, se ejecutarán en modo no estricto, incluso cuando se llama desde una función que se ejecuta en modo estricto. Vea esta respuesta para una explicación.this
). Ahora veo que te referías a llamar a otras funciones.Recomiendo encarecidamente a cada desarrollador que comience a usar el modo estricto ahora. Hay suficientes navegadores que lo admiten que el modo estricto legítimamente nos 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 captado todo. Definitivamente no solo agregamos
use strict
nuestro código y asumimos que no hay errores. Entonces, el abandono es que es hora de comenzar a usar esta función de lenguaje increíblemente útil para escribir un mejor código.Por ejemplo,
JSLint es un depurador escrito por Douglas Crockford. Simplemente pegue su script, y escaneará rápidamente en busca de problemas y errores notables en su código.
fuente
Me gustaría ofrecer una respuesta algo más fundada que complemente las otras respuestas. Esperaba editar la respuesta más popular, pero fallé. Traté de hacerlo lo más completo y completo posible.
Puede consultar la documentación de MDN para obtener más información.
"use strict"
Una directiva introducida en ECMAScript 5.Las directivas son similares a las declaraciones, pero diferentes.
use strict
no contiene palabras clave: la directiva es una declaración de expresión simple, que consiste en un literal de cadena especial (entre comillas simples o dobles). Los motores de JavaScript, que no implementan ECMAScript 5, simplemente ven una declaración de expresión sin efectos secundarios. Se espera que las futuras versiones de los estándares ECMAScript se introduzcanuse
como una palabra clave real; las citas se volverían obsoletas.use strict
solo se puede usar al comienzo de un script o de una función, es decir, debe preceder a cualquier otra declaración (real). No tiene que ser la primera instrucción en un script de función: puede estar precedido por otras expresiones de declaración que consisten en literales de cadena (y las implementaciones de JavaScript pueden tratarlas como directivas específicas de implementación). Las declaraciones de 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
use strict
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 unause strict
directiva. El contenido de una función se considera código estricto cuando la función en sí misma se define en un código estricto o cuando la función contiene unause strict
directiva. El código que se pasa a uneval()
método se considera código estricto cuandoeval()
se llamó desde un código estricto o contiene lause strict
propia directiva.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):
with
declaración en modo estricto.Object
, obtendrá unReferenceError
. En modo normal, el identificador se declara implícitamente como una variable global (como una propiedad de la globalObject
)this
tiene el valorundefined
en funciones que se invocaron como funciones (no como métodos). (En modo normalthis
siempre apunta al globalObject
). Esta diferencia se puede usar para probar si una implementación admite el modo estricto:También cuando se invoca una función con
call()
oapply
en modo estricto, entoncesthis
es exactamente el valor del primer argumento de lacall()
oapply()
invocación. (En modo normalnull
yundefined
se reemplazan por losObject
valores globales y, 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 modo normal, ambos simplemente fallan sin mensaje de error).eval()
, no puede declarar o definir variables o funciones en el ámbito de la persona que llama (como puede hacerlo en modo normal). En cambio, se crea un nuevo alcanceeval()
y las variables y funciones están dentro de ese alcance. Ese alcance se destruye después de queeval()
finaliza la ejecución.SyntaxError
cuando eldelete
operador sea seguido por un identificador no calificado (una variable, función o parámetro de función). En modo normal, ladelete
expresión no haría nada y se evalúa comofalse
.TypeError
mensaje cuando intente eliminar una propiedad no configurable. (En modo normal, el intento simplemente falla ydelete
se evalúa la expresiónfalse
).0x
. (En modo normal, algunas implementaciones permiten literales octales).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.arguments.caller
yarguments.callee
causa unTypeError
en una función en modo estricto. Además, algunas propiedades de llamadas y argumentos de las funciones en modo estricto provocan unTypeError
cuando intentas leerlas.fuente
0
.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 lo usemos
use strict
, el código arrojará errores que ayudarán al desarrollador a solucionarlo por adelantado.Algunas cosas importantes que he aprendido después de usar
use strict
:Impide la declaración de variable global:
Ahora, este código crea
nameoftree
un alcance global al que se puede acceder usandowindow.nameoftree
. Cuando implementamosuse strict
el código arrojaríamos un error.Sample
Elimina la
with
declaración:with
las declaraciones no se pueden minimizar usando herramientas como uglify-js . También están en desuso y se eliminan de futuras versiones de JavaScript.Sample
Previene duplicados:
Cuando tenemos propiedad duplicada, arroja una excepción
Hay pocos más, pero necesito obtener más conocimiento sobre eso.
fuente
Si usa un navegador lanzado en el último año más o menos, entonces probablemente sea compatible con el modo JavaScript Strict. Solo los navegadores anteriores 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 seguirá funcionando también en los 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).
fuente
Al agregar
"use strict";
, los siguientes casos arrojará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 reservados (en previsión de ECMAScript 6 ):
implements
,interface
,let
,package
,private
,protected
,public
,static
, yyield
.Declarando función en bloques
Sintaxis octal
this
señalar al objeto global.Declarar dos veces el mismo nombre para un nombre de propiedad en un objeto literal
Este ya no es el caso en ECMAScript 6 ( error 1041128 ).
Declarando dos argumentos de función con la misma función de nombre
Establecer un valor en una variable no declarada
Usar
delete
en un nombre variabledelete myVariable;
Usando
eval
oarguments
como variable o nombre de argumento de funciónFuentes:
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)
fuente
El modo estricto realiza varios cambios en la semántica de JavaScript normal:
elimina algunos errores silenciosos de JavaScript cambiándolos para arrojar errores.
corrige errores que dificultan que los motores de JavaScript realicen optimizaciones.
prohíbe que alguna sintaxis se defina en futuras versiones de ECMAScript.
para más información vistit Strict Mode- Javascript
fuente
"Usar estricto"; es un seguro que el programador no usará las propiedades sueltas o malas de JavaScript. Es una guía, al igual que una regla te ayudará a hacer líneas rectas. "Usar estricto" lo ayudará a hacer "codificación directa".
Aquellos que prefieren no usar reglas para hacer sus líneas rectas generalmente terminan en esas páginas pidiendo que otros 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 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 con menos experiencia tengan acceso a JavaScript y darles tiempo para adaptarse a las nuevas y más seguras prácticas de codificación.
fuente
Incluir
use strict
en el 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.fuente
Citando de w3schools :
Consulte http://www.w3schools.com/js/js_strict.asp para saber más
fuente
"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 ser utilizado en ECMA5, en ECMA6 es parte de JavaScript por defecto , por lo que no es necesario agregarlo si está utilizando ES6.Mire estas declaraciones y ejemplos de MDN:
1) modo estricto en funciones
2) modo estricto de script completo
3) Asignación a un global no grabable
Puedes leer más sobre MDN .
fuente
Hay una buena charla de algunas personas que estaban en el comité ECMAScript: Cambios a JavaScript, Parte 1: ECMAScript 5 " sobre cómo el uso incremental de
"use strict"
interruptor permite a los implementadores de JavaScript limpiar muchas de las características peligrosas de JavaScript sin romper repentinamente cada sitio web en el mundo.Por supuesto, también habla sobre cuáles son muchas de esas características erróneas y cómo ECMAScript 5 las soluciona.
fuente
Pequeños ejemplos para comparar:
Modo no estricto:
Modo estricto:
Modo no estricto:
fuente
this === 'a'
en ambos ejemplos?Tenga en cuenta que
use strict
se introdujo en EcmaScript 5 y se mantuvo desde entonces.A continuación se detallan las condiciones para activar el modo estricto en ES6 y ES7 :
fuente
Las razones principales por las que los desarrolladores deberían usar
"use strict"
son:Evita la declaración accidental de variables globales. El uso
"use strict()"
se asegurará de que las variables se declarenvar
antes de su uso. P.ej:"use strict"
directiva solo se reconoce al comienzo de un script o una función.La cadena
"arguments"
no se puede usar como una variable:Restringirá los usos de palabras clave como variables. Intentar usarlos arrojará errores.
En resumen, su código será menos propenso a errores y, a su vez, le hará escribir un buen código.
Para leer más al respecto, puede consultar aquí .
fuente
"uso estricto"; es el esfuerzo de ECMA para hacer que JavaScript sea un poco más robusto. Trae a JS un intento de hacerlo al menos un poco "estricto" (otros idiomas implementan reglas estrictas desde los años 90). En realidad, "obliga" a los desarrolladores de JavaScript a seguir algún tipo de mejores prácticas de codificación. Aún así, JavaScript es muy frágil. No existen variables tipeadas, métodos tipeados, etc. Recomiendo a los desarrolladores de JavaScript que aprendan un lenguaje más robusto como Java o ActionScript3 e implementen las mismas mejores prácticas en su código JavaScript, funcionará mejor y será más fácil de usar. depurar.
fuente
El modo "estricto" de JavaScript se introdujo en ECMAScript 5.
Escribir
"use strict";
en la parte superior de su archivo JS activa la comprobación estricta de sintaxis. Realiza las siguientes tareas para nosotros:muestra un error si intenta asignar a una variable no declarada
evita que sobrescriba las bibliotecas clave del sistema JS
prohíbe algunas características de lenguaje inseguras o propensas a errores
use strict
También funciona dentro de las funciones individuales. Siempre es una mejor práctica incluiruse strict
en su código.Problema de compatibilidad del navegador: las directivas de "uso" están destinadas a ser compatibles con versiones anteriores. Los navegadores que no los admitan solo verán un literal de cadena que ya no se hace referencia. Entonces, lo pasarán por alto y seguirán adelante.
fuente
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 de la manera no esperada. Y, como se escribió anteriormente, hace que el código sea más estricto.fuente
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 globals accidentales
Sin duplicados
Elimina con
Elimina esta coerción.
Eval más seguro ()
Errores para inmutables
también puedes leer este artículo para más detalles
fuente
Normalmente, JavaScript no sigue reglas estrictas, por lo tanto, aumenta las posibilidades de errores. Después de usar
"use strict"
, el código JavaScript debe seguir un conjunto estricto de reglas como en otros lenguajes de programación, como el uso de terminadores, declaración antes de la inicialización, etc.Si
"use strict"
se usa, el código debe escribirse siguiendo un estricto conjunto de reglas, lo que disminuye las posibilidades de errores y ambigüedades.fuente
"uso estricto"; Define que el código JavaScript debe ejecutarse en "modo estricto".
Todos los navegadores modernos admiten "uso estricto", excepto Internet Explorer 9 y versiones inferiores .
Desventaja
Si un desarrollador usa 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 tienen las ventajas de que se generen errores adicionales, por lo que el error puede fallar en silencio.
Además, como se mencionó anteriormente, el modo estricto le impide hacer ciertas cosas.
La gente generalmente piensa que no debes usar esas cosas en primer lugar, pero a algunos desarrolladores no les gusta la restricción y quieren usar todas las características del lenguaje.
Para obtener un ejemplo básico y para referencia, consulte:
https://www.tutorialsteacher.com/javascript/javascript-strict
fuente
El modo estricto puede evitar pérdidas de memoria.
Compruebe la función a continuación escrita en modo no estricto:
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 ese ámbito de función en particular. Como el compilador entendió que no existe tal variable, verificará en el ámbito externo. En nuestro caso, es el alcance global. Nuevamente, el compilador entendió que tampoco hay 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, 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 verificará el espacio global y creará una variable para nosotros allí. Eso significa que se deben hacer verificaciones adicionales. Esto afectará el rendimiento de la aplicación.
Ahora escribamos la misma función en modo estricto.
Obtendremos el siguiente error.
Aquí, el compilador arroja el error de referencia. En modo estricto, el compilador no nos permite usar la variable sin declararla. Por lo tanto, se pueden evitar las pérdidas de memoria. Además, podemos escribir código más optimizado.
fuente