Heim >Web-Frontend >js-Tutorial >Detaillierte Erläuterung der Reihenfolge der Codeausführung in JavaScript

Detaillierte Erläuterung der Reihenfolge der Codeausführung in JavaScript

黄舟
黄舟Original
2017-10-30 09:48:161718Durchsuche

1. js--->Einzelner Thread

Genau genommen hat Javascriptnicht das Konzept mehrerer Threads, alle Programme werden nacheinander von einem einzelnen Thread ausgeführt.

  1. Was ist Single Thread?

Laienhaft ausgedrückt: Wenn der Code ausgeführt wird und ein anderer Code ausgeführt werden soll, muss er warten, bis der aktuelle Code ausgeführt wird. Nehmen wir einen Code, um es zu erklären

 for(var i=1;i<=3;i++){
   setTimeout(function(){
     console.log(i); //输出:4,4,4
   },0)
 }

Schauen wir uns den obigen Code an. Da die Verzögerungszeit auf 0 eingestellt ist, sollte die Schleife einmal ausgeführt und sofort ein i gedruckt werden. aber das endgültige gedruckte Ergebnis ist: 4, 4, 4. Der Grund für die oben genannten Ergebnisse liegt genau darin, dass der js-Code eine Single-Thread-Anwendung ist.

Während des Ausführungsprozesses wird zuerst die for-Schleife angetroffen, und die for-Schleife gelangt zuerst in den Thread. Wenn i = 1 ist und die Schleife setTimeOut erreicht, hat die for-Schleife die Ausführung noch nicht abgeschlossen und setTimeOut wird an einem Ort (Thread-Pool) abgelegt, um auf die Ausführung zu warten. Zu diesem Zeitpunkt wird die for-Schleife weiterhin ausgeführt. Wenn i = 2 ist, ist die Ausführung der for-Schleife noch nicht abgeschlossen. Zu diesem Zeitpunkt wird setTimeOut noch im Thread-Pool platziert und wartet auf die Ausführung Die for-Schleife wird dreimal abgeschlossen. Nach Abschluss der for-Schleife befindet sich der Thread zu diesem Zeitpunkt im Leerlauf. Das setTimeOut wartet auf die Ausführung im Thread-Pool und gibt i nacheinander aus. Nach Abschluss der for-Schleife wird i zu 4 , also werden drei 4er gedruckt.

 2. Wenn Sie die obige Situation ändern möchten, können Sie den folgenden Code verwenden:

//将var变为let
for(let i=1; i<=3; i++){
  setTimeOut(function(){
    console.log(i); //输出的结果为1,2,3
  },0);
}
//用自执行函数进行包裹
for(var i=1; i<=3; i++){
  !function(i){
    setTimeOut(function(){
      console.log(i); //输出的结果为1,2,3
    },0);
  }(i)
}

2. Die Funktion von in js-Domäne und Codeausführung

 >>> Funktionsumfang

Lassen Sie uns zunächst die folgenden Konzepte verstehen:

1. In der JS-Sprache gibt es keinen Bereich auf Blockebene, der der C-Sprache ähnelt.

 2. Der Bereich der obersten Ebene in der js-Sprache liegt im Bereich des Fensterobjekts, das als globaler Bereich bezeichnet wird. Im globalen Bereich deklarierte Variablen sind globale Variablen.

 3. Variablen im Rahmen einer js-Funktion können nur innerhalb der Funktion und nicht außerhalb der Funktion verwendet werden. Solche Variablen sind lokale Variablen.

4. JS-Funktionen können verschachtelt werden. Die Verschachtelung mehrerer Funktionen stellt die schichtweise Verschachtelung von Bereichen dar. Dies wird in JS als Bereichskette bezeichnet.

5. Regeln für den Zugriff auf Variablen der js-Bereichskette:

(1) Wenn im aktuellen Bereich eine Variable vorhanden ist, auf die zugegriffen werden soll, verwenden Sie die Variable im aktuellen Bereich.

(2) Wenn die Variable, auf die zugegriffen werden soll, im aktuellen Bereich nicht vorhanden ist, wird sie im oberen Bereich bis zum globalen Bereich durchsucht. > Variablen und Funktionen deklarieren, Variablen jedoch keine Werte zuweisen.

2. Die Ausführungsphase des Codes In dieser Phase werden Variablen Werte zugewiesen und Funktionen deklariert.

Nachdem wir uns einige der oben genannten spezifischen Konzepte angesehen haben, nehmen wir einen Code als Beispiel:

Schauen Sie sich den Code oben an: Das erste a gibt undefiniert aus. Grund: Gemäß den Zugriffsregeln der js-Bereichskette existiert die Variable a, auf die zugegriffen werden soll, im aktuellen Bereich, sodass die Variable im aktuellen Bereich verwendet wird. Gemäß der Ausführungsreihenfolge des js-Codes wird a zu diesem Zeitpunkt nur deklariert, aber nicht zugewiesen. Der Standardwert ist undefiniert, daher wird undefiniert ausgegeben.

Und das zweite a gibt 1 aus. Gerade weil a zu diesem Zeitpunkt deklariert und ihm ein Wert zugewiesen wurde, gibt a 1 aus.

var a=1; //声明了一个全局变量
function func(){
  console.log(a); //输出:undefined。打印a,而在func这个作用域中已经声明了a变量,按照js的执行顺序,此时的a并未被赋值。
  var a=1;
  console.log(a); //输出:1。
}
func();

Zusammenfassung


Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Reihenfolge der Codeausführung in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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