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
javascript
Marcus Lee
quelle
quelle
0 undefined
.a = 5
der Block verlässt. Laut Bergifunction a
wird der Betrogene gehisst.Antworten:
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.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
quelle