let x = '1' function first(){ console.log(x) } x='2' function second(){ let x='3' first() } second()Mi pregunta es, ¿por qué la respuesta es '2' en lugar de '3'? Sé que let es el alcance del bloque y var es el alcance de la función, pero simplemente no lo entiendo bien. Por favor, ayúdame aquí, ¡muchas gracias!
Está asignando 3 a una variable local, solo tiene un efecto dentro de la segunda función
Este ejemplo funciona:
let x = '1' function first(){ console.log(x) } x='2' function second(){ x='3' first() } second()Inicialmente, la función first no tiene idea de qué se trata x. por lo que buscó automáticamente en el ámbito superior.
con mucho gusto, en el ámbito global hay x definición.
Por lo tanto, cuando este script se inicializó, la función console.log in function first reserva la dirección de memoria de x y observa esa variable global todo el tiempo.
Esto se debe a shadowing .
En JavaScript, las variables con el mismo nombre se pueden especificar en varias capas de ámbito anidado. En tal situación, las variables locales ganan prioridad sobre las variables globales. Si declara una variable local y una variable global con el mismo nombre, la variable local tendrá prioridad cuando la use dentro de una función o bloque.
Y en su caso, no hay una variable local definida dentro de su función first() , por lo que tomará el valor de x = 2 de la variable global.
let x = '1' function first() { console.log(x) } x = '2' function second() { let x = '3' first() } second() Vea el siguiente código, si ha declarado x=4 dentro de first() , devolverá el valor 4 instead of 2
let x = '1' function first() { x = '4' console.log(x) } x = '2' function second() { let x = '3' first() } second() Echa un vistazo a esto si quieres saber más sobre JavaScript Variable Scope and Hoisting : https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/