Heim > Artikel > Web-Frontend > Eine kurze Analyse des Problems beim Heben von Variablendeklarationen in JavaScript (Hoisting)
1. Variablendeklaration Heben
Heben Englisch ['hɔɪstɪŋ] US ['hɔɪstɪŋ]
n. Heben, Heben
v. Heben, heben (Partizip Präsens von Heben)
Schauen wir uns zuerst eine Kastanie an
var cc = 'hello'; function foo(){ console.log(cc); var cc = 'world'; console.log(cc); } foo(); console.log(cc);
Hier wird undefiniert ausgegeben, 'Welt', 'Hallo'
Hier gibt es zwei Hauptwissenspunkte:
1. Geltungsbereich
2, Förderung der Variablendeklaration
JavaScript ist eine interpretierte Sprache. Wenn der Code in einer Interpreterumgebung (z. B. der V8-Engine von Chrome) ausgeführt wird, findet ein Voranalyseprozess statt, und dann werden Variablendeklarationen und Funktionsdeklarationen gefördert Dieses Verhalten wird als Deklarationshub bezeichnet.
Wenn Sie sich das obige Beispiel noch einmal ansehen, verfügt dieser Code über zwei Gültigkeitsebenen, den globalen Bereich und den Funktionsbereich foo sowie die Variable Die Deklaration in foo wird während des Voranalysevorgangs an den Anfang des Funktionsbereichs verschoben, sodass der Code wie folgt aussieht:
var cc = 'hello'; function foo(){ var cc; console.log(cc); cc = 'world'; console.log(cc); } foo(); console.log(cc);
Wann Das erste Protokoll wird ausgeführt, die Variable cc wird nur deklariert und nicht zugewiesen, sodass das, was gedruckt wird, undefiniert ist
2. Verbesserung der Funktionsdeklaration
Es gibt zwei Möglichkeiten, Funktionen zu deklarieren: Funktionsdeklaration und Funktionsausdruck
// 函数声明 function foo(a, b) { return a + b; } // 函数表达式 var foo = function(a, b) { return a + b; }
Wenn der Parser Daten in die Ausführungsumgebung lädt, werden die Funktionsausdrücke nicht gleich erstellt. Der Parser liest zunächst die Funktionsdeklaration und macht sie verfügbar (zugänglich), bevor er Code ausführt. Der Funktionsausdruck wird erst dann tatsächlich interpretiert und ausgeführt, wenn der Parser die Codezeile erreicht, in der er sich befindet.
Natürlich können auch Funktionsdeklarationen und Funktionsausdrücke gleichzeitig verwendet werden, z. B. var a = function b(){} Das Ergebnis ist, dass es nur die Wirkung eines Funktionsausdrucks hat b wird automatisch ignoriert, sodass nur ein variabler Boost-Effekt auftritt.