Heim  >  Artikel  >  Web-Frontend  >  Klären Sie die lexikalischen, statischen, dynamischen, Funktions- und Blockbereiche in JS

Klären Sie die lexikalischen, statischen, dynamischen, Funktions- und Blockbereiche in JS

黄舟
黄舟Original
2017-02-28 15:00:121711Durchsuche

Nun, ich habe gerade viel geschrieben, aber es wurde durch meinen Fehler überschrieben.

Es ist in Ordnung, es noch einmal zu schreiben. Ich erinnere Sie auch daran, darüber zu bloggen Plattform und seien Sie wie ich. Für Studenten, die auch gerne Markdown-Sprache verwenden, um Wörter zu codieren
„Online speichern, um sie zu entwerfen“ ist eine gute Angewohnheit, hmm
Heute ist Double Eleven, ich habe das Gefühl, es ist Zeit, etwas zu kaufen. .


Wenn viele Schüler JavaScript lernen, hören sie möglicherweise von „verschiedenen“ Bereichen.
Was sind lexikalischer Bereich, statischer Bereich, dynamischer Bereich, Funktionsbereich, Blockbereich?
Ich kann nicht Erzählen Sie den Unterschied
Lassen Sie mich meine Gedanken für alle klarstellen

Bereichsmodus

Der Arbeitsmodus des Bereichs ist in zwei Typen unterteilt: statische Funktionsdomäne und dynamischer Bereich
Statischer Bereich umfasst Funktionsumfang und Blockumfang
Die Schüler fragen sich vielleicht, was ist mit dem lexikalischen Umfang
Tatsächlich sind lexikalischer Umfang und statischer Umfang dasselbe

Klären Sie die lexikalischen, statischen, dynamischen, Funktions- und Blockbereiche in JS

Das Bild ist nicht gut , jeder versteht einfach, was ich meine.
Nachdem wir diesen Punkt geklärt haben, müssen wir noch eine Frage hinzufügen. Das heißt, gibt es einen dynamischen Bereich in JavaScript?

Zu diesem Punkt habe ich in zwei Büchern, die ich gelesen habe, völlig gegensätzliche Antworten erhalten


Ob es sich um die with-Anweisung oder die Catch-Klausel der Try-Catch-Anweisung handelt oder ob sie die eval( ) Funktionen gelten alle als dynamische Bereiche. Der dynamische Bereich existiert nur während der Codeausführung und kann daher nicht durch statische Analyse (Betrachtung der Codestruktur) erkannt werden. ——„Hochleistungs-JavaScript“ /p24

Was klar sein muss, ist, dass JavaScript tatsächlich keinen dynamischen Bereich hat. Es hat schlicht und einfach nur lexikalischen Umfang. Dieser Mechanismus ähnelt jedoch in gewisser Weise dem dynamischen Bereich. ——„JavaScript You Don't Know (Volume 1)“ /p59

Beide dieser beiden Bücher sind sehr neu und beide sind sehr maßgebliche Bücher, sehr zu empfehlen
besonders „JavaScript You „Don't Know“-Reihe, als der zweite Band letzten Monat herauskam, konnte ich es kaum erwarten, einen im Internet zu kaufen

Ich wurde nicht enttäuscht
Ähm, ich bin abgeschweift, kommen wir zurück zum Thema
Ich denke, dass die großen Autoren des Originalbuchs ein unterschiedliches Verständnis von dynamischem Umfang haben
Deshalb diese scheinbar widersprüchliche Sichtweise
Hier möchte ich über meine Position sprechen
Soweit ich weiß, denke ich auch
In JavaScript gibt es keinen dynamischen Bereich
Was ist der Unterschied zwischen statischem und dynamischem BereichSiehe unten↓

Lexikalischer Bereich und dynamischer Bereich

Lassen Sie mich mit a beginnen Stück Code

Durch unser tiefgreifendes Verständnis von Vorkompilierung und Umfang
function foo(){
    var a = 1;
    bar();
}function bar(){
    console.log(a);
}var a = 100;
foo();
Im lexikalischen Umfang unseres JavaScript gibt das Endergebnis 100 aus


Aber wenn unser Umfang a ist dynamischer Bereich, was gedruckt wird, wird 1

Warum ist das so?

Das wichtigste Merkmal des lexikalischen Bereichs ist, dass sein Definitionsprozess während der Schreibphase stattfindet (wenn eval() und with nicht verwendet werden).
Dynamischer Bereich ermöglicht die dynamische Bestimmung des Bereichs zur Laufzeit

Der lexikalische Bereich kümmert sich darum, wo die Funktion deklariert wird, und die Bereichskette basiert auf der Bereichsverschachtelung

Der dynamische Bereich kümmert sich darum, wo die Funktion aufgerufen wird, und die Bereichskette basiert auf der Aufrufliste


I übersetzte die obigen Wörter in Der Code ist

Lexikalischer Bereich: Da die Bar-Funktion global deklariert ist, gebe ich den Wert der globalen Variablen a aus

Dynamischer Bereich: Da die Bar-Funktion innerhalb der Foo-Funktion aufgerufen wird, also Ich gebe foo aus Der Wert der Variablen a innerhalb
Das ist mein Verständnis

Die Programmiersprachen, mit denen ich jetzt in Kontakt gekommen bin, sind alle lexikalisch gültig. Ich habe noch nie eine Sprache gesehen basierend auf dem dynamischen Bereich

C, C++, C#, Java, JavaScript und PHP sind alle lexikalische Bereiche

Unter ihnen basieren JavaScript und PHP auf dem Funktionsbereich und andere basieren auf dem Blockbereich

Funktionsumfang und Blockumfang

Nach meinem Verständnis

Der Funktionsumfang ist der vom Funktionscodeblock generierte Bereich, und der Blockumfang ist der vom Codeblock in geschweiften Klammern generierte Bereich

Ich habe Ich habe dies in vielen Blogs gesehen, in denen es nur einen Funktionsumfang gibt (großer Fehler)
Das ist völlig falsch und es gibt keinen Streit
JavaScript basiert tatsächlich auf dem Funktionsumfang, aber das bedeutet nicht, dass wir das tun keinen Blockbereich haben
Es gibt viele Sonderfälle: das with-Schlüsselwort, die Catch-Klausel der try-catch-Anweisung, das let-Schlüsselwort (ES6) und das const-Schlüsselwort (ES6)
Hier werde ich nur darauf eingehen Sprechen Sie kurz darüber
Sowohl das Schlüsselwort with als auch die Catch-Klausel können im Block Scope generiert werden
Ich hätte darüber ausführlich in einem Artikel schreiben sollen
Wenn Sie interessiert sind, können Sie es sich ansehen
Portal->JavaScript täuscht lexikalische Auswertung, mit und Catch und seinen Leistungsproblemen

Das Schlüsselwort let ist var sehr ähnlich, beide deklarieren Variablen, aber das Schlüsselwort let kann die Variable an einen beliebigen Bereich binden.
Und die Verwendung von let zum Deklarieren wird im Blockbereich nicht hochgestuft.
Das Schlüsselwort const gilt auch deklariert Variablen, deklariert aber auch Konstanten und bindet auch Variablen an den Blockbereich
Dies ist genau das Gleiche wie unser const-Schlüsselwort in C/C++
Mehr über mich Ich werde ausführlich darüber sprechen, wenn ich über ES6 schreibe Wissen später
Jetzt müssen wir nur noch wissen „Es gibt einen Blockbereich in JavaScript

Zusammenfassung

Wie üblich gebe ich Ihnen eine Zusammenfassung

  • Bereichsarbeitsmodi: Lexikalischer/statischer Bereich, dynamischer Bereich

  • Lexikalischer Bereich: Funktionsumfang, Blockbereich

  • JavaScript hat keinen dynamischen Bereich

  • JavaScript hat einen Blockbereich

  • With, Catch-Klausel, let (ES6), const (ES6 ) Blockbereich generieren

  • Der lexikalische Bereich kümmert sich darum, wo die Funktion deklariert wird

  • Dynamisches Scoping kümmert sich darum, wo die Funktion aufgerufen wird

  • Die lexikalische Bereichsbereichsverkettung basiert auf der Bereichsverschachtelung

  • Die dynamische Bereichsbereichskette basiert auf dem Aufrufstapel

Das Obige dient dazu, den Inhalt des lexikalischen, statischen, dynamischen, Funktions- und Blockumfangs in JS zu verdeutlichen. Weitere verwandte Inhalte finden Sie im PHP Chinese Net (www.php.cn)!


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