Für Schüler, die gerade erst JavaScript gelernt haben, könnten einige seiner Verhaltensweisen verwirrend sein.
Es unterscheidet sich stark von dem C/C++, das Sie in der Schule gelernt haben.
Zum Beispiel ist dies das case
a = 1;var a;console.log(a);// 1
Einige Schüler denken vielleicht, dass es undefiniert sein sollte, weil var a anscheinend a neu zugewiesen wurde
In diesem Fall
console.log(a);// undefinedvar a = 1;
a wurde nicht deklariert noch Drucken Sie einfach aus, es sollte ein Fehler sein, oder beziehen Sie sich auf das Verhalten des Browsers oben und es sollte 2 ausgeben
Das Ergebnis ist jedoch undefiniert
Die Codesequenz, die Sie sehen, ist nicht unbedingt die echte js Engine Die Reihenfolge der Ausführung
Dies ist das JavaScript-Verbesserungsverhalten, über das ich heute sprechen möchte
Tatsächlich dient das Schreiben dieses Artikels dazu, das Wissen vor der Kompilierung zu ergänzen
Wenn Sie sich mit der Vorkompilierung nicht auskennen Klicken Sie vor dem Lesen unten
JavaScript-Vorkompilierung
Die Vorkompilierung von JavaScript führt direkt zu seinem Werbeverhalten
Tatsächlich können wir durch das Verständnis der Vorkompilierung klar verstehen, warum
Die Vorkompilierung erfolgt vor der Ausführung
, sodass die Ausführung dieser beiden Codeblöcke der Ausführung von Code wie diesem entspricht
var a;a = 1;console.log(a);// 1
var a;console.log(a);// undefineda = 1;
Beachten Sie für dieses Werbeverhalten diese beiden Sätze
Variablendeklarationsförderung, die gesamte Funktionsdeklaration wird verbessert
Nochmals:
function demo(){….}这才叫做函数声明 var demo = function(){….}这不叫函数声明
Solange Sie das Vorkompilierungsprinzip verstehen, ist das Werbeverhalten leicht zu verstehen
Wir sind es gewohnt, var a = 1
als Deklaration
zu behandeln, aber die js-Engine glaubt nicht, dass sie es in var = a
Deklaration und a = 1
Initialisierung
aufteilt . Die erste ist eine Aufgabe in der Kompilierungsphase und die zweite ist in der Ausführungsphase.
Egal, wo Ihre Deklaration im Bereich erscheint, wird sie vor der Ausführung verarbeitet.
Das ist entspricht dem Verschieben der Variablendeklaration und der Funktionsdeklaration an die Spitze des Gültigkeitsbereichs
Dieser Prozess heißt Verbesserung
Wir dürfen während der Programmierung niemals wiederholte Variablen deklarieren, geschweige denn Funktionen und deklarieren gewöhnliche Variablen mit demselben Namen
Übrigens, Variablen Es ist eine gute Angewohnheit, eine Var-Deklaration am oberen Rand des Bereichs zu verwenden (Prinzip einer einzelnen Variable)
Auf diese Weise müssen Sie sich keine Sorgen machen Beförderungsverhalten
Trotzdem müssen wir diesen Prozess noch verstehen, er steht auch im Mittelpunkt der Interviewfragen
Nehmen wir ein altmodisches Beispiel und werfen einen Blick darauf
function a(a, b){ console.log(a); console.log(c); c = 0; console.log(b); var c; a = 3; b = 2; console.log(a); console.log(c); console.log(b); function b(){}; console.log(b); } a(1);
Ich weiß nicht, ob Sie verwirrt sind, es gibt eine Menge ABC
Die richtige Antwort lautet:
1 undefined function b(){} 3 0 2 2
Lassen Sie es uns anhand der Vorkompilierung analysieren Zuerst, und überprüfen Sie es übrigens
AO-Objekt (aktives Objekt) erstellen
Suchen Sie nach formalen Funktionsparametern und Variablendeklarationen Innerhalb der Funktion werden die formalen Parameternamen und Variablennamen als Attribute des AO-Objekts verwendet. Der Wert ist undefiniert.
Die tatsächlichen Parameter und formalen Parameter sind vereinheitlicht und die tatsächlichen Parameterwerte Weisen Sie ihn dem formalen Parameter
zu, um die Funktionsdeklaration zu finden. Der Funktionsname wird als Attribut des AO-Objekts verwendet und der Wert ist die Funktionsreferenz
wird generiert, bevor die letzte Funktion a ausgeführt wird. Das AO-Objekt sieht so aus
//伪代码AO->{ a: 1 b: function(){} c: undefined}
, es entspricht also der Ausführung einer solchen Funktion
(der Funktionsname a steht nicht in Konflikt mit die darin enthaltenen Variablen)
function a(){ var a = 1; var b = function(){}; var c; console.log(a);//1 console.log(c);//undefined c = 0; console.log(b);//function(){} a = 3; b = 2; console.log(a);//3 console.log(c);//0 console.log(b);//2 console.log(b);//2}
Wir sind also sehr schnell auf die Antwort gekommen
Wenn es eine Variablendeklaration und eine Funktionsdeklaration mit demselben Namen gibt
Die Funktionsdeklaration muss die überschreiben Variablendeklaration (JavaScript-Funktionen sind die ersten Bürger mit verschiedenen Privilegien)
Wenn eine Variablendeklaration denselben Namen hat wie eine andere Variablendeklaration
oder eine Funktionsdeklaration denselben Namen wie eine andere Funktionsdeklaration hat
Das ist es, wer es bekommt Priorität unter dem Dokument
Das Obige ist, was ich heute mit Ihnen geteilt habe JavaScript-Werbeverhalten
ist in zwei Sätzen zusammengefasst: Variablendeklarationsförderung, allgemeine Funktionsdeklarationsförderung
Tatsächlich handelt es sich um ein unvermeidliches Verhalten, das durch die Vorkompilierung der JS-Engine verursacht wird
Das Obige ist JavaScript. Zur Verbesserung des Verhaltens und des Prinzipanalyseinhalts beachten Sie bitte die chinesische PHP-Website (www. php.cn) für weitere verwandte Inhalte!