Heim >Web-Frontend >js-Tutorial >In welcher Reihenfolge wird JS-Code ausgeführt?

In welcher Reihenfolge wird JS-Code ausgeführt?

php中世界最好的语言
php中世界最好的语言Original
2017-12-31 11:35:142234Durchsuche

Dieses Mal zeige ich Ihnen die Reihenfolge, in der JS-Code ausgeführt wird. Streng genommen hat Javascript nicht das Konzept, dass mehrere Threads ausgeführt werden Nacheinander finden Sie in diesem Artikel eine detaillierte Analyse.

1. Was ist ein einzelner Thread?

Laienhaft ausgedrückt: Wenn der Code ausgeführt wird und ein anderer Code ausgeführt werden möchte, 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 Ausführung befindet sich der Thread zu diesem Zeitpunkt im Leerlauf. 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. js Funktionsumfang und Codeausführung

 >>>Funktionsumfang

Lassen Sie uns zunächst die folgenden Konzepte verstehen:

 1. In js-Sprache gibt es keinen Blockebenenbereich ähnlich der C-Sprache.

2. Der oberste Bereich 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 innerhalb des Gültigkeitsbereichs 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.

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();

Ich glaube, dass Sie die Methode beherrschen, nachdem Sie die obige Einführung gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Verwandte Lektüre:


Detaillierte Einführung in die Verwendung von require.js

Verwenden von jQuery zum Deduplizieren von Array-Sortiervorgängen

So verwenden Sie die ES6-Destrukturierungszuweisungsfunktion

Das obige ist der detaillierte Inhalt vonIn welcher Reihenfolge wird JS-Code ausgeführt?. 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