Lassen Sie uns zunächst darüber sprechen, was Wortsegmentierung bedeutet, eine Zeichenkette in Codeblöcke zu zerlegen, die für die Programmiersprache von Bedeutung sind. Diese Codeblöcke werden Token genannt. Beispielsweise wird der Code var a = 2
in die folgenden lexikalischen Einheiten zerlegt. Konkret: var,a,=,2.
Hinweis: Bei der Wortsegmentierung wird eigentlich der gesamte obige Code in Segmente aufgeteilt.
Beim Parsen wird der Strom lexikalischer Einheiten in einen Baum umgewandelt, der aus Elementen besteht, die Ebene für Ebene verschachtelt sind und die grammatikalische Struktur des Programms darstellen. Dieser Baum heißt: abstrakter Syntaxbaum. Da die Standardwörter hier zu lang sind, werden wir sie nicht direkt in einer intuitiveren Form darstellen. Die Einzelheiten lauten wie folgt:
Analyse: Der abstrakte Syntaxbaum verfügt über einen Knoten der obersten Ebene mit der Bezeichnung var, gefolgt von einem untergeordneten Knoten mit der Variablen a und einem Knoten mit dem Zuweisungsoperator =. Unter dem Zuweisungssymbol befindet sich ein weiterer untergeordneter Knoten von 2. Konkret entspricht es dem Code var a = 2
.
Der Prozess der Umwandlung eines abstrakten Syntaxbaums in ausführbaren Code wird als Codegenerierung bezeichnet. Dieser Prozess hängt eng mit der Sprache und der Zielplattform zusammen. Einfach ausgedrückt gibt es eine Möglichkeit, den abstrakten Syntaxbaum von var a = 2
in Maschinenanweisungen umzuwandeln. Wird verwendet, um eine Variable namens a zu erstellen und einen Wert in a zu speichern.
basieren hauptsächlich auf der Engine, um JavaScript-Code auszuführen. Wenn die Engine var a = 2 ausführt, ermittelt sie, ob die Variable a deklariert wurde, indem sie danach sucht. Der Suchvorgang wird durch Bereiche unterstützt. Während des Abfragevorgangs führt die Engine eine LHS-Abfrage (Linksabfrage) für die Variable a und eine Rechtsabfrage für den Wert durch. Einfach ausgedrückt: Wenn die Variable auf der linken Seite der Zuweisungsoperation erscheint, wird eine LHS-Abfrage durchgeführt, und wenn sie auf der rechten Seite erscheint, wird eine RHS-Abfrage durchgeführt. Genauer gesagt versucht die LHS-Abfrage, den Container der Variablen selbst zu finden, während die RHS-Abfrage versucht, ihren Quellwert abzurufen.
Hinweis: In der Funktion gibt es sowohl LHS- als auch RHS-Abfragen. Denn beim Übergeben von Parametern führt der Code eine implizite Zuweisung durch.
Wenn die Variable nicht deklariert wurde, ist das Verhalten der LHS-Abfrage und der RHS-Abfrage unterschiedlich.
Funktion foo(a){ console.log(a+b); b=a;}foo(2)
Hinweis: Die erste rechte Abfrage von b kann die Variable nicht finden, was bedeutet, dass es sich um eine nicht deklarierte Variable handelt, da sie in keinem relevanten Bereich gefunden werden kann. Wenn RHS die erforderlichen Variablen im verschachtelten Bereich nicht finden kann, löst die Engine eine Ausnahme aus.
foo(a){ var b=a; gib a+b zurück; } var c=foo(2)
Problem: Finden Sie alle LHS-Abfragen und RHS
Antwort: LHS(c=…,a=2,b=…) und RHS(foo(2…,=a,a…,…b))