var a;
if (true) {
a = 5;
function a() {}
a = 0;
console.log(a)
}
console.log(a)
Eu vi o código acima, uma função é declarada em {}. Eu acho que imprimiria 0 0, mas imprime 0 5
javascript
Marcus Lee
fonte
fonte
0 undefined
.a = 5
deixa o bloco. Segundo bergi no dupe,function a
será içada.Respostas:
O seguinte acontece:
(1) Existem duas declarações de variáveis
a
, uma dentro do bloco e outra fora dele.(2) A declaração da função é içada e vinculada à variável de blocos internos.
(3)
a = 5
é alcançado, que substitui a variável de bloco.(4) a declaração de função é alcançada e a variável de bloco é copiada para a variável externa. Ambos são 5 agora.
(5)
a = 0
é alcançado, que substitui a variável de bloco. A variável externa não é afetada por isso.Na verdade, isso não faz parte da especificação, faz parte da semântica de compatibilidade herdada da Web ; portanto , não declare funções dentro de blocos e não confie nesse código para se comportar dessa maneira .
Isso também é explicado aqui
fonte