Heim  >  Artikel  >  Web-Frontend  >  Einführung in das Heben von JavaScript-Deklarationen (mit Beispielen)

Einführung in das Heben von JavaScript-Deklarationen (mit Beispielen)

不言
不言nach vorne
2019-03-22 09:39:471875Durchsuche

Der Inhalt dieses Artikels ist eine Einführung in die Verbesserung der JavaScript-Deklaration (mit Beispielen). Freunde in Not können darauf verweisen.

Javascript-Deklarationsförderung

Bevor ich die Deklarationsförderung analysiere, müssen meiner Meinung nach zwei Punkte bekannt sein:

1. Zwei Möglichkeiten für die Engine, Variablen abzufragen

Die Art und Weise, wie die Engine Variablen abfragt, kann in zwei Arten unterteilt werden: LHS und RHS. Sie können die Bedeutung grob anhand von „L“ und „R“ verstehen, die die linke bzw. rechte Seite der Zuweisungsoperation darstellen. (Es kann nicht nur als die linke und rechte Seite von „=" verstanden werden, da es viele Formen von Zuweisungsoperationen gibt.)

Lassen Sie mich kurz auf mein Verständnis dieser beiden Abfragemethoden eingehen:
LHS : Auftrag Wer ist das Ziel der Operation? (Abfragevariable)
RHS: Wer ist die Quelle der Zuweisungsoperation? (Fragen Sie den Wert der Variablen ab)

Dies ist möglicherweise etwas schwer zu verstehen. Zum Beispiel:

function foo(a){
    //这里存在一个隐式变量分配,LHS查询变量a,并赋值2.
    //隐式a = 2;
    //左边LHS查询变量b,查询作用域中是否存在b这个变量。
    //右边RHS查询变量a的值,将a赋值给b。
    var b = a;
    //返回a,b是RHS查询变量a的值和变量b的值并使用。
    return a + b;
}
//左边LHS查询变量c,查询作用域中是否存在c这个变量。
//右边RHS引用函数foo,将2作为参数传进去。
var c = foo(2);

2. Ausnahmen

Eine Sache, die bei Ausnahmen hervorzuheben ist, ist Folgendes Sie müssen sich im strikten Modus befinden. Denn wenn die LHS-Abfrage im nicht-strikten Modus die abgefragte Variable im globalen Bereich der obersten Ebene nicht finden kann, wird eine Variable mit diesem Namen erstellt und an die Engine zurückgegeben.

ReferenceError: im Zusammenhang mit einem Fehler bei der Bereichsbestimmung. (Zum Beispiel: Die erforderliche Variable kann im Bereich nicht gefunden werden)
TypeError: Die Bereichsbestimmung war erfolgreich, aber die Operation am Ergebnis ist unzulässig oder unzumutbar. (Zum Beispiel: Versuch, einen Funktionsaufruf für einen Nicht-Funktionstypwert durchzuführen oder auf eine Eigenschaft in einem Null- oder undefinierten Typwert zu verweisen)

Zum Beispiel:

"strict"
function foo() {
    console.log(a) //undefined
    console.log(b) //ReferenceError
}
var a = 2;

Deklarationsförderung

1. Vorläufiges Verständnis

Beim Schreiben von JavaScript-Code hat man oft das Gefühl, dass der Code von oben nach unten ausgeführt wird. Aber wenn es um Statement-Promotion geht, wird diese Idee durchbrochen.

Zum Beispiel:

a = 2;
var a;
console.log(a);

运行结果为: 2

Wenn eine Ausführung von oben nach unten gemäß dem gesunden Menschenverstand ausgeführt wird, sollte das erwartete Ergebnis einer Ausführung undefiniert sein, aber warum ist es 2?
Dies ist das Ergebnis der Statement-Werbung.

2. Weiteres Verständnis

Wenn Sie die Statement-Promotion zum ersten Mal verstehen, stoßen Sie auf den folgenden Code:

console.log(a);
var a = 2;

运行结果为:undefined

Nachdem Sie ein vorläufiges Verständnis der Statement-Promotion haben, werden Sie Ich denke natürlich, dass die Anweisung hochgestuft wird, aber wenn sie bei der Deklaration zugewiesen wird, kann der Wert der Variablen nicht abgerufen werden.

Tatsächlich können die laufenden Schritte des obigen Codes wie folgt unterteilt werden:

var a; //声明提升
console.log(a); //打印a的值
a = 2; //对a进行赋值

Es stellt sich heraus, dass die Anweisungsförderung eine wörtliche Anweisungsförderung ist und der Rest der Vorgänge (z. B. Zuweisung). und andere Logik) sind noch vorhanden.

Deklarieren Sie eine Funktion, um entsprechende Vorgänge auszuführen, und Sie erhalten das Ergebnis der Funktionsdeklarationsförderung. Dies ist hier zu finden: Deklarationen von Variablen und Funktionen werden vor anderem Code heraufgestuft und ausgeführt.

3. Nach und nach verstehen

Durch mehrere Experimente können wir nach und nach verstehen, dass die Deklarationsförderung tatsächlich Folgendes ist: Die Deklaration von Variablen und Funktionen wird in anderen Codes gefördert (aktueller Funktionsbereich).

Wenn Sie an diesem Punkt angelangt sind, werden einige Leute denken, dass es auch gefördert wird, wenn es sich um einen Funktionsausdruck handelt?

Die Antwort lautet: Nein. Darüber hinaus können selbst benannte Funktionsausdrücke nicht verwendet werden, bevor der Namensbezeichner zugewiesen wurde.

Zum Beispiel:

foo(); //TypeError
bar(); //ReferenceError
var foo = function bar(){};

Der Code wird zerlegt in:

var foo; //变量声明提升
foo(); //foo对undefined值进行函数调用导致非法操作,故TypeError
bar(); //bar函数并没有声明,故ReferenceError
foo = function bar(){}; //对foo进行赋值

Also: Der Funktionsausdruck kann nicht verwendet werden, bevor der Namensbezeichner zugewiesen wurde.

Hinweis: 1. Jeder Bereich wird beworben. (Der innerhalb der Funktion gebildete Bereich verfügt also auch über einen Promotion-Vorgang, und der Promotion-Vorgang ist auf den aktuellen internen Bereich der Funktion beschränkt.)
2 Variablen werden heraufgestuft, die Funktion Heraufstufung priorisieren.
3. Funktionsdeklarationen innerhalb eines normalen Blocks werden normalerweise an die Spitze des Gültigkeitsbereichs befördert.

4. Tiefes Verständnis

Wenn Sie „Javascript, das Sie nicht kennen“ lesen, werden Sie im Lernprozess feststellen, dass es eine Erklärung gibt: Erklärungen abgegeben Die Verwendung von „let“ erfolgt nicht innerhalb des Geltungsbereichs. Die Deklaration existiert erst, wenn der deklarierte Code ausgeführt wird.

Zum Beispiel:

console.log(a);
let a = 2;

运行结果是:ReferenceError: Cannot access 'a' before initialization. //初始化前无法访问"a"

Dann kehrte ich zu dem Code zurück, den ich zuvor ausgeführt hatte, ersetzte let durch var und das zurückgegebene Ergebnis war undefiniert.

Durch die Kombination der beiden und das Lesen habe ich zwei Monate gebraucht, um den Artikel let zu verstehen, und ich habe festgestellt, dass ich ein neueres Verständnis dafür habe, ob let verbessert wird.

Der Autor unterteilt js-Variablen in drei Teile: erstellen, initialisieren und zuweisen .

Der Grund, warum die oben genannten Vorgänge unterschiedliche Antworten haben, bedeutet nicht, dass let nicht erstellt wird, sondern dass es einen Initialisierungsprozess gibt, der nicht ausgeführt wird. Und die Verwendung der Variablen vor der Initialisierung bildet eine vorübergehende Totzone.

Nach dem Testen von var, let und function kann Folgendes festgestellt werden:

Die Erstellung und Initialisierung von var wird gefördert, die Zuweisung wird jedoch nicht gefördert.

Die Erstellung von Let wird gefördert, Initialisierung und Zuweisung werden nicht gefördert. Die Erstellung, Initialisierung und Zuweisung der

Funktion wird gefördert.

Dieser Artikel ist hier zu Ende. Weitere spannende Inhalte finden Sie in der Spalte JavaScript-Tutorial-Video auf der chinesischen PHP-Website!

Das obige ist der detaillierte Inhalt vonEinführung in das Heben von JavaScript-Deklarationen (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen