Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Analyse des Problems beim Heben von Variablendeklarationen in JavaScript (Hoisting)

Eine kurze Analyse des Problems beim Heben von Variablendeklarationen in JavaScript (Hoisting)

高洛峰
高洛峰Original
2016-12-03 13:45:331192Durchsuche

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.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn