Berikut ini terjadi:
(1) Ada dua deklarasi variabel a, satu di dalam blok dan satu di luarnya.
(2) Deklarasi fungsi diangkat, dan terikat ke variabel blok dalam.
(3) a = 5tercapai, yang menimpa variabel blok.
(4) deklarasi fungsi tercapai, dan variabel blok disalin ke variabel luar. Keduanya 5 sekarang.
(5) a = 0 tercapai, yang menimpa variabel blok. Variabel luar tidak terpengaruh oleh ini.
var a¹;
if (true) {
function a²() {} // hoisted
a² = 5;
a¹ = a²; // at the location of the declaration, the variable leaves the block
a² = 0;
console.log(a²)
}
console.log(a¹);
Ini sebenarnya bukan bagian dari spesifikasi, ini adalah bagian dari semantik kompatibilitas web warisan , jadi jangan mendeklarasikan fungsi di dalam blok dan tidak bergantung pada kode ini untuk berperilaku dengan cara ini .
Ini juga dijelaskan di sini