var a;
if (true) {
a = 5;
function a() {}
a = 0;
console.log(a)
}
console.log(a)
Vi el código anterior, una función se declara en {}. Creo que imprimiría 0 0, pero imprime 0 5
javascript
Marcus Lee
fuente
fuente
0 undefined
.a = 5
deja el bloque. Según bergi en el dupe,function a
será izado.Respuestas:
Sucede lo siguiente:
(1) Existen dos declaraciones de variables
a
, una dentro del bloque y otra fuera del mismo.(2) La declaración de función se iza y se une a la variable de bloques internos.
(3)
a = 5
se alcanza, lo que anula la variable de bloque.(4) se alcanza la declaración de función y la variable de bloque se copia en la variable externa. Ambos son 5 ahora.
(5)
a = 0
se alcanza, lo que anula la variable de bloque. La variable externa no se ve afectada por esto.En realidad, esto no es realmente parte de la especificación, es parte de la semántica de compatibilidad heredada de la web , por lo que no declare funciones dentro de bloques y no confíe en que este código se comporte de esta manera .
Esto también se explica aquí
fuente