¿Cuál es el comportamiento de las variables aquí, es decir, el cierre. La salida es "indefinida", lo que no entiendo.
var x = 21; var test = function () { console.log(x); // output: undefined var x = 20; }; test();Javascript crea inicialmente un contexto de ejecución global y un nuevo contexto de ejecución cada vez que se inserta una función en la pila de llamadas. Esto sucede en dos fases: primero crea un entorno variable donde cada variable se almacena en un par clave, valor de nombre_variable: indefinido (mientras que las funciones se almacenan con las definiciones de funciones). Luego comienza a ejecutar el código línea por línea.
Si tuviera que recorrer este ejemplo: contexto de ejecución global: entorno variable {x: indefinido, prueba: definición de función para prueba}
Luego, el código se ejecuta línea por línea y 21 reemplaza undefined por el valor de x. Ahora se llama a la prueba, por lo que se crea un nuevo contexto de ejecución.
Contexto de ejecución de la prueba: { x: indefinido }
Ahora, cuando comienza a ejecutar el código, busca x dentro de este contexto de ejecución y ve que el valor no está definido y lo registra. Si x no estuviera presente en la prueba, habría mirado el contexto de ejecución del padre de la función, que resulta ser el contexto de ejecución global, y habría registrado 21.
Lea sobre el contexto de ejecución: https://www.javascripttutorial.net/javascript-execution-context/ Luego lea sobre el alcance léxico para comprender este comportamiento.
El motor Javascript explicará su código de esta manera:
var x = 21; var test = function () { var x; console.log(x); // output: undefined x = 20; }; test();Si olvida poner el parámetro en la prueba de función, el código debería ser así:
var x = 21; var test = function (x) { //here u should put parameter "x" console.log(x); // The output from calling method var x = 20; //last "x" //if u want to get the value of last "x" should call console.log(x); // the value of of last "x" }; test(x); //here u should put parameter "x"en código explico cada cosa 😉
Notas: - Las variables definidas con let no se pueden volver a declarar. Las variables definidas con let deben declararse antes de su uso. Variables definidas con let have Block Scope. Redeclarar una variable con let, en otro bloque, ESTÁ permitido pero con var No permitido