var a;
if (true) {
a = 5;
function a() {}
a = 0;
console.log(a)
}
console.log(a)
Ich habe den obigen Code gesehen, eine Funktion ist in {} deklariert. Ich denke, es würde 0 0 drucken, aber es druckt 0 5
quelle
var a;
if (true) {
a = 5;
function a() {}
a = 0;
console.log(a)
}
console.log(a)
Ich habe den obigen Code gesehen, eine Funktion ist in {} deklariert. Ich denke, es würde 0 0 drucken, aber es druckt 0 5
Folgendes passiert:
(1) Es gibt zwei Variablendeklarationen a
, eine innerhalb des Blocks und eine außerhalb des Blocks.
(2) Die Funktionsdeklaration wird angehoben und an die Variable der inneren Blöcke gebunden.
(3) a = 5
erreicht ist, wodurch die Blockvariable überschrieben wird.
(4) Die Funktionsdeklaration wird erreicht und die Blockvariable wird in die äußere Variable kopiert. Beide sind jetzt 5.
(5) a = 0
erreicht ist, wodurch die Blockvariable überschrieben wird. Die äußere Variable ist davon nicht betroffen.
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¹);
Dies ist eigentlich nicht wirklich Teil der Spezifikation, sondern Teil der Semantik der Web-Legacy-Kompatibilität. Deklarieren Sie also keine Funktionen innerhalb von Blöcken und verlassen Sie sich nicht auf diesen Code, um sich auf diese Weise zu verhalten .
Dies wird auch hier erklärt
0 undefined
.a = 5
der Block verlässt. Laut Bergifunction a
wird der Betrogene gehisst.