Die Konzepte von Umfang, Umfangskette, Ausführungsumgebung und Stapel sind in JavaScript sehr wichtig. Lassen Sie uns sie hier klären > Der Bereich innerhalb der lokalen Bereichsfunktion, der globale Bereich ist Fenster
- Die Bereichskette hängt von der Position ab, an der die Funktion deklariert wird. Der aktuelle Bereich steht an erster Stelle Dann suchen Sie nach außen, eine solche Reihenfolge hat nichts damit zu tun, wo die Funktion aufgerufen wird.
- Die Ausführungsumgebung ist die Sammlung von Daten und Variablen, auf die zugegriffen werden kann die Funktion, die den Umfang aller Daten und Variablen in der Kette darstellt;
- Der Ausführungsumgebungsstapel basiert auf der Reihenfolge der Codeausführung. Auf jede Ausführungsumgebung wird schichtweise zugegriffen Wenn die aktuelle Ausführungsumgebung (die Daten und Variablen in der aktuellen Bereichskette speichert) die Variable nicht finden kann, bedeutet dies, dass sie nicht gefunden werden kann nicht in der vorherigen Ausführungsumgebung suchen. Es unterscheidet sich von der Bereichskette. Bereich
- JavaScript hat kein Konzept für den Bereich auf Blockebene, sondern nur für den Bereich auf Funktionsebene : Variablen sind im Funktionskörper und seinen Unterfunktionen sichtbar, wo sie deklariert werden. Der Bereich ist der zugängliche Bereich von Variablen und Funktionen, der die Sichtbarkeit und den Lebenszyklus von Variablen und Funktionen steuert. In JavaScript hat der Bereich von Variablen einen globalen und einen lokalen Bereich.
Eine Variable, die nicht innerhalb einer Funktion oder ohne Variable deklariert ist, ist eine globale Variable und hat einen globalen Gültigkeitsbereich
<script type="text/javascript">
function test1(){
a = 1;//全局变量,只有在当前函数运行时,才有效 }
test1();
console.log(a);//1 注意test1函数必须运行,不然找不到a
</script>
Nach dem Login kopieren
<script type="text/javascript">
var b = 1;//全局变量
console.log(b === window.b);
//true 全局变量可以当做window对象的属性用,他们是一样的;
</script>
Nach dem Login kopieren
Variablen, die innerhalb der Funktion deklariert werden, sind lokale Variablen und können nur innerhalb des Funktionskörpers verwendet werden Verwenden Sie var, es handelt sich immer noch um lokale Variablen.
Bereichskette Die Bereichskette hängt von der Position ab, an der die Funktion deklariert wird. Beim Parsen beginnt sie mit dem aktuellen Bereich Kann im aktuellen Bereich nicht gefunden werden, sucht die Engine weiter im äußeren verschachtelten Bereich, bis sie die Variable findet oder den äußersten Bereich (d. h. den globalen Bereich) erreicht.
Die Route wurde bestimmt und hat nichts damit zu tun, wo die Funktion ausgeführt wird
<script type="text/javascript">
var c = 1;//全局变量//
console.log(d);//ReferenceError: d is not defined 引用错误,当前作用域就是最外层作用域,依然找不到d
function test2(d){
console.log(c);
//1 全局变量,哪都可以访问;(先找当前作用域,找不到,就向外层作用域找,直到window最外层,找到了) console.log(d);//3 形参是局部变量,只有当前作用域下可以访问 }
test2(3);
</script>
Nach dem Login kopieren
Bezeichner mit demselben Namen können in mehrstufigen verschachtelten Bereichen definiert werden, was als „Schatteneffekt“ bezeichnet wird. , der interne Bezeichner „schattet“ den externen Bezeichner
Durch die window.a-Technologie können Sie auf globale Variablen zugreifen, die von Variablen mit demselben Namen verdeckt werden. Wenn jedoch nicht-globale Variablen verdeckt sind, kann auf sie trotzdem nicht zugegriffen werden.
<script type="text/javascript">
var a = 1;
var b = 2;
var c = 3;
var d = 4;
function inner(d) {//它的作用域链是inner---全局
var c = 8;
console.log(a);//1 当前作用域找不到a,去全局作用域找到了a=1 console.log(b);//2 当前作用域找不到b,去全局作用域找到了b=2 console.log(c);//8 当前作用域找到了c=8 console.log(d);//7 当前作用域找到了d=7,形参也是局部作用域
// console.log(e);//ReferenceError: e is not defined 引用错误,找不到e, 它的作用域链是inner---全局 console.log(a+b+c+d);//18 } function outter(e) { var a = 5;//inner()的作用域链是inner---全局,所以这个a相当于无效
var b = 6;//inner()的作用域链是inner---全局,所以这个a相当于无效 inner(7);
}
outter(999);//这个999无效,里面的e根本找不到
</script>
Nach dem Login kopieren
- Ausführungsumgebung
- Ausführungskontext, auch Ausführungskontext genannt. Jede Ausführungsumgebung verfügt über ein Variablenobjekt (Variable
Objekt
), das alle Variablen und Daten speichert, auf die die Funktion zugreifen kann (d. h. alle Daten und Variablen in der Bereichskette der Funktion). Unser Code kann nicht darauf zugreifen, er wird von der Engine verwendet.
Ausführungsumgebungsstapel Wenn die Ausführung in eine Funktion eintritt, wird die Ausführungsumgebung der Funktion in einen Stapel verschoben. Nachdem die Funktion ausgeführt wurde, entfernt der Stapel seine Ausführungsumgebung, die darin enthaltenen Variablen und Daten werden markiert und gelöscht, wartet auf die Speicherbereinigung und gibt dann die Kontrolle an die vorherige Ausführungsumgebung zurück. Die Ausführung im Javascript-Programm wird durch diesen Mechanismus gesteuert.
<script type="text/javascript">
var a = 'Lily';
var b = 'Lucy';
function outer() {
var b = 'Jesica';
var c = 'Susan';
function inner(c) {
console.log(a);//Lily
console.log(window.b);//Lucy
console.log(b);//Jesica
console.log(c);//Jenifer
}
inner('Jenifer');
}
outer();
</script>
Nach dem Login kopieren
Es ist zu beachten, dass die Variable nicht gefunden werden kann, wenn sie in der aktuellen Ausführungsumgebung (die Daten und Variablen in der aktuellen Bereichskette speichert) nicht gefunden wird Es ist nicht erforderlich, die Variable zu finden. Die vorherige Ausführungsumgebung wird nicht durchsucht, da sie sich von der Bereichskette unterscheidet.
Die Ausführungsreihenfolge des Codes ist nicht alle zeilenweise die Aufrufreihenfolge der Funktion. Verwandte Themen:
Der Code gelangt in die globale Ausführungsumgebung und die globale Ausführungsumgebung wird in den Umgebungsstapel gestellt
Wenn eine Funktion ausgeführt wird, wird die Ausführungsumgebung der Funktion an die Spitze des Umgebungsstapels verschoben, wobei die vorherige Ausführungsumgebung hinten liegt.
- Die globale Ausführung Die Umgebung wird zuerst eingegeben, sie befindet sich also immer unten; es ähnelt dem Konzept eines Stapels.
- Nachdem die Funktion ausgeführt wurde, wird ihre Ausführungsumgebung von oben entfernt Die gespeicherten Daten und Funktionen werden markiert und gelöscht.
- Die Kontrolle wird an die vorherige Ausführungsumgebung übergeben und die Ausführung wird fortgesetzt >Die globale Ausführungsumgebung wird zerstört, wenn die Seite geschlossen wird.
-
Die Codeausführung gelangt in die globale Ausführungsumgebung und der Code in der globalen Ausführungsumgebung tritt in die Anweisungsförderung ein ;
-
Führen Sie Zeile 2 aus, weisen Sie dann Zeile 2 b=2 zu; dann weisen Sie Zeile 5 d=4 zu; 🎜>
Führen Sie Zeile 20 aus, rufen Sie die Funktion „outer“ (999) auf, geben Sie dann die Umgebung zur Ausführung der Funktion „outer“ (999) ein, deklarieren Sie die Heraufstufung und übergeben Sie den tatsächlichen Parameter 999 an den formalen Parameter e Zwei Ausführungsumgebungen, äußere(999) ist die aktuelle Ausführungsumgebung;
führt Zeile 16 aus, weist dann b=6 in Zeile 17 zu;
Führen Sie Zeile 18 aus, rufen Sie die Funktion inner(7) auf, geben Sie dann die Ausführungsumgebung der Funktion inner(7) ein, deklarieren Sie die Heraufstufung und übergeben Sie den tatsächlichen Parameter 7 an den formalen Parameter d; Zeile 7 ausführen, c=8 zuweisen; dann ausführen und ausgeben;
Codeoptimierung
Da es notwendig ist, Variablen im Bereich zu finden Kette Um die Leistung zu verbrauchen, sollten wir Variablen so schnell wie möglich finden. Wenn Funktionen also in mehreren Ebenen verschachtelt sind, sollten wir so oft wie möglich lokale Variablen innerhalb der Funktion verwenden.
Wir können sagen, dass wir globale Variablen verwenden Die Funktion ist eine bereichsübergreifende Operation. Wenn ein bereichsübergreifender Wert mehrmals innerhalb der Funktion verwendet wird, speichern wir ihn in einer lokalen Variablen, was die Leistung verbessern kann.
Das obige ist der detaillierte Inhalt vonJavaScript-Bereichskette und Ausführungsumgebung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!