Heim >Web-Frontend >js-Tutorial >Detaillierte Einführung in den Bereich in JavaScript (Codebeispiel)

Detaillierte Einführung in den Bereich in JavaScript (Codebeispiel)

不言
不言nach vorne
2019-03-11 16:59:121720Durchsuche

Der Inhalt dieses Artikels ist eine detaillierte Einführung (Codebeispiel) über den Umfang in JavaScript. Ich hoffe, dass er für Sie hilfreich ist. hat geholfen.

Fast alle Programmiersprachen haben das Konzept des Umfangs. Worauf bezieht sich der Umfang also genau? Der Bereich ist ein Satz von Regeln für die Speicherung und den Zugriff auf Variablen, wenn eine Programmiersprache Variablen definiert. Schauen wir uns als Nächstes an, wie dieser Satz von Regeln festgelegt wird >

Kompilierungsprinzip

In traditionellen kompilierten Sprachen gibt es vor der Codeausführung einen Kompilierungsprozess:

Wortsegmentierung/lexikalische Analyse: Codeanweisungen in sinnvollen Code zerlegen Blöcke, auch lexikalische Einheiten genannt.
  • Parsing/Grammatikanalyse: Konvertieren Sie lexikalische Einheiten in eine Baumstruktur mit grammatikalischen Regeln, die Ebene für Ebene verschachtelt sind, auch abstrakter Syntaxbaum (AST) genannt.
  • Codegenerierung: AST analysieren und die Maschinenanweisungen konvertieren
  • unterscheiden sich von herkömmlichen kompilierten Sprachen. In den meisten Fällen wird der Kompilierungsprozess unmittelbar nach Abschluss des Kompilierungsvorgangs ausgeführt Kompilierungsprozess Erzielen Sie innerhalb des Zeitlimits eine optimale Leistung. Schauen wir uns nun den Kompilierungsprozess von var a = 2 an:

Wenn der Compiler auf die Variable a stößt, fragt er den Bereich, ob in der Sammlung desselben Bereichs bereits eine Variable mit diesem Namen vorhanden ist. Wenn ja, ignoriert der Compiler die Deklaration und fährt mit der Kompilierung fort; andernfalls fordert er den Bereich auf, eine neue Variable a
  • in der Sammlung des aktuellen Bereichs zu deklarieren. Als nächstes generiert der Compiler Laufzeitinformationen für die Engine . Der erforderliche Code wird verwendet, um die Zuweisungsoperation a=2 abzuwickeln. Wenn die Engine läuft, fragt sie zunächst den Bereich, ob im aktuellen Bereichssatz eine Variable namens a vorhanden ist. Wenn nicht, verwendet die Engine diese Variable. Wenn die Engine schließlich a findet, weist sie ihr den Wert 2 zu. Andernfalls löst die Engine eine Ausnahme aus
Lexical Scope

Scope hat im Allgemeinen zwei Arbeitsmodelle, das erste wird von den meisten Programmiersprachen verwendet. Der andere Typ von Der verwendete lexikalische Bereich wird als dynamischer Bereich bezeichnet. Beispielsweise verwendet das Bash-Skript einen dynamischen Bereich. Der lexikalische Bereich wird durch den Ort bestimmt, an dem Sie Variablen schreiben, und den Bereich, den Sie beim Schreiben von Code blockieren. Er wird durch die Position der Variablendefinition bestimmt, während der dynamische Bereich durch die Verwendung von Variablen bestimmt wird nach dem Standort. Schauen wir uns ein Beispiel an:

function foo(a) {
  var b = a * 2;
  function bar(c) {
    console.log(a, b, c)
  }
  bar(b * 3)
}
foo(2)

Lassen Sie uns zunächst analysieren, wie viele Bereiche es insgesamt gibt?

Globaler Bereich, der die Variable foo enthält
  1. Der von der Funktion foo erstellte Bereich, der die Variablen a, b, bar enthält
  2. Der von erstellte Bereich die bar-Funktion, die die c-Variable
  3. enthält. Als nächstes analysieren wir den Variablensuchprozess. Wenn die Engine console.log() ausführt, muss sie Verweise auf die drei Variablen a, b, finden. und c. Beginnen Sie zunächst mit dem innersten bar()-Bereich. Die Engine kann daher bis zum foo()-Bereich suchen. Der Suchvorgang ist für b und c identisch . Die Bereichssuche beginnt immer auf der innersten Ebene der Laufzeit und sucht nach außen, bis die erste passende Variable gefunden wird.

Funktionsbereich

Funktionsbereich bedeutet, dass alle zu dieser Funktion gehörenden Variablen im Rahmen der gesamten Funktion verwendet und wiederverwendet werden können. Das wissen wir die Definition, aber welchen Nutzen hat die Existenz eines Funktionsumfangs? Schauen wir uns als Nächstes die Sekunden des Funktionsumfangs an.


Interne Implementierung ausblenden

Interne Implementierung ausblenden bedeutet, Variablen und Funktionen in den Funktionsbereich einzuschließen, um den Zweck des Ausblendens zu erreichen. Im Softwaredesign gibt es ein sehr bekanntes Prinzip namens „Prinzip der minimalen Offenlegung“, das sich darauf bezieht, den erforderlichen Inhalt auf ein Minimum zu beschränken und andere Inhalte, wie z. B. das API-Design von Modulen oder Objekten, auszublenden. Verwenden Sie den Funktionsbereich, um Variablen und Funktionen zu umschließen, um das Prinzip der minimalen Offenlegung zu erreichen und direkten externen Zugriff zu verhindern:

function doSomething(a) {
  b = a + doSomethingElse( a * 2 );
  console.log( b * 3 );
}
  
function doSomethingElse(a) {
  return a - 1;
}
var b;
doSomething( 2 ); // 15”

In diesem Code sollten doSomethingElse und b privat in doSomething sein, aber Wenn sie nicht offengelegt werden, führt dies dazu, dass sie in unerwarteter Form verwendet werden und zu unerwarteten Ergebnissen führen. Ein vernünftigeres Design sollte darin bestehen, diese privaten Inhalte in doSomething zu verbergen, wie zum Beispiel:

function doSomething(a) {
  function doSomethingElse(a) {
    return a - 1;
  }
  var b;
  b = a + doSomethingElse( a * 2 );
  console.log( b * 3 );
}
doSomething( 2 );

wie folgt: Auf doSomethingElse kann auch nicht von außerhalb von doSomething zugegriffen werden, aber es gibt auch einige Probleme. Erstens wird die Funktion doSomething im globalen Bereich deklariert, wodurch die globale Rolle verschmutzt wird Vermeiden Sie dies? Kann der verschmutzte Bereich selbst ausgeführt werden, ohne ihn aufzurufen? Die Antwort ist ein Funktionsausdruck. Sehen Sie sich das folgende Beispiel an:

(function doSomething(a) {
  function doSomethingElse(a) {
    return a - 1;
  }
  var b;
  b = a + doSomethingElse( a * 2 );
  console.log( b * 3 );
})(2)

Schauen Sie sich zunächst (function doSomething(){}) an, bei dem es sich um einen Funktionsausdruck handelt, der sich von der Funktionsdeklaration unterscheidet und in Klammern steht then (function doSomething(a){})() ruft nach Wert auf, damit es selbst ausgeführt werden kann und den Gültigkeitsbereich nicht verschmutzt. Die Community hat einen Begriff für diese Verwendung definiert: IIFE, was für „Immediate Execution of Function“ steht Ausdruck

块作用域

除JavaScript外很多编程语言都支持块作用域,尽管你可能写过很伪块作用域形式的代码,最常见的就是for循环:

for(var i=0; i<10; i++) {
  console.log(i)
}

写这段代码通常是希望变量i在循环内部使用,但是实际上i会被绑定到外部作用域中,要确保没有在作用域的其他地方意外使用i,就只能依靠自觉,这时候块级作用域就显得尤为有用,ES6改变了现状,引入了新的let、const关键字,let关键字可以将变量绑定到所在的任意作用域中,也就是let为其声明的变量隐式地创建了作用域:

for(let i=0; i<10; i++) {
  console.log(i)        
}
console.log(i) // ReferenceError

这时候i就只会在for循环的内部有效


Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in den Bereich in JavaScript (Codebeispiel). 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