Tengo el siguiente código
"use strict"; x = 12; function myFunction() { } myFunction(); entonces estoy usando use strict en la parte superior de mi secuencia de comandos y ahora estoy en modo estricto, por lo que no puedo tener una variable no declarada como x
Eso me da el siguiente error en mi consola
Uncaught ReferenceError: x is not defined .
Pero cuando ejecuto este código
myFunction(); "use strict"; x = 12; function myFunction() { } console.log('the script continues...') No obtengo el mismo error para mi variable no declarada x . Como puede ver, el script continúa ejecutándose.
Porqué es eso ? ¿Por qué no obtengo el mismo error cuando trato de llamar a mi función izada, así que llame a la función antes de que se declare? ¿Por qué afecta el ámbito global?
Como dice en la documentación de MDN para el modo estricto , el "use strict"; La secuencia es solo una directiva de modo estricto si es lo primero en el archivo que no sea un comentario. Con su llamada de función encima, ya no es lo primero en el archivo y, por lo tanto, no es una directiva de modo estricto; en cambio, es solo un literal de cadena independiente que no usa nada.
Dado que su código no está en modo estricto, x = 12; está asignando un valor a un identificador no declarado, que (en modo suelto) crea un global implícito . (Más en mi publicación antigua en mi antiguo blog anémico: The Horror of Implicit Globals ). Esta es una de las muchas razones por las que usar el modo estricto es Good Thing ™, porque al asignar a un identificador no declarado es el error que siempre debería tener. estado.
Nota al margen: otra forma de usar el modo estricto es usar módulos nativos en lugar del "use strict"; . Los módulos, como casi todos los ámbitos nuevos en JavaScript desde ES2015, son estrictos de forma predeterminada (y tienen otros beneficios, como su propio ámbito y la capacidad de declarar dependencias entre ellos).