Heim  >  Artikel  >  Web-Frontend  >  setTimeout()-Funktion in js

setTimeout()-Funktion in js

一个新手
一个新手Original
2017-09-21 09:45:412450Durchsuche

In js ist die Funktion setTimeout() eine globale Variable, egal wo sie sich befindet, es ist eine globale Variable und keine lokale Variable. Das Ergebnis des folgenden Beispiels könnte Sie also überraschen:

function A() {
    this.b = function() {
        console.log(1)
    }
}
var c = new A()
setTimeout(c.b, 10)

Manche Leute denken vielleicht, dass das Ausgabeergebnis des obigen Beispiels 1 ist, aber das Ergebnis ist undefiniert. Dies liegt daran, dass die Funktion setTImeout() eine globale Variable ist. Sie sendet das c.b an die globale Variable. Die globale Variable verfügt jedoch nicht über das Attribut b und gibt daher undefiniert zurück.

In js ist der Betriebsmechanismus der Funktion setTimeout() wie folgt, und das Gleiche gilt für die Funktion setInterval(). Verschieben Sie den angegebenen Code aus dieser Ausführung, warten Sie bis zur nächsten Runde der Ereignisschleife und prüfen Sie dann, ob die angegebene Zeit erreicht ist. Wenn er eintrifft, wird der entsprechende Code ausgeführt. Wenn er nicht eintrifft, wird mit der erneuten Beurteilung bis zur nächsten Runde der Ereignisschleife gewartet. Dies bedeutet, dass der durch setTimeout angegebene Code erst ausgeführt wird, wenn alle diesmal ausgeführten Codes ausgeführt wurden. ·

In jeder Runde der Ereignisschleife werden die Aufgaben, die in der „Aufgabenwarteschlange“ ausgeführt werden müssen, auf einmal ausgeführt. Sowohl setTimeout als auch setInterval fügen Aufgaben am Ende der „Aufgabenwarteschlange“ hinzu. Daher müssen sie tatsächlich warten, bis alle Synchronisierungsaufgaben des aktuellen Skripts ausgeführt sind, und dann warten, bis alle Aufgaben der „Aufgabenwarteschlange“ dieser Ereignisschleife ausgeführt sind, bevor sie mit der Ausführung beginnen. Da ungewiss ist, wie lange die Ausführung der vorherigen Aufgaben dauern wird, kann nicht garantiert werden, dass die durch setTimeout und setInterval angegebenen Aufgaben gemäß der geplanten Zeit ausgeführt werden.

Wenn also eine vorherige Funktion blockiert ist, wird gewartet, bis die Funktion ausgeführt wird, bevor sie ausgeführt werden kann. Da js Single-Threaded ist, ist es einfacher zu blockieren.

In der Funktion setTimeout() beträgt die schnellste Laufzeit 4 Millisekunden. Selbst wenn der Verzögerungsparameter als 0 oder eine negative Zahl geschrieben wird, wird er nicht sofort ausgeführt. Wenn der Verzögerungsparameter 0 oder eine negative Zahl ist, müssen Sie warten, bis die Synchronisierungsaufgabe und die Ereignisschleife (d. h. die Aufgabenwarteschlange) des aktuellen Schritts ausgeführt werden, bevor Sie mit der Ausführung beginnen. Da der Parameter 0 oder eine negative Zahl ist, ist die Funktion Führen Sie es einfach so früh wie möglich aus als andere setTimeout()-Funktionen, und der Parameter ist 0 oder eine negative Zahl selbst hat die gleiche Priorität. Zum Beispiel:

setTimeout('console.log(1)',0)
console.log(2)

Das zurückgegebene Ergebnis ist 2 1

setTimeout('console.log(1)',0)
setTimeout('console.log(2)',-1)
setTimeout('console.log(3)',-1)
setTimeout('console.log(4)',0)

Das zurückgegebene Ergebnis ist 1 2 3 4

In der Funktion setTimeout() gibt es Ein weiterer Punkt ist erwähnenswert. Das heißt, sein erster Parameter muss der zu kompilierende Code oder eine Funktionsmethode sein. Im obigen Beispiel wird console.log() in einfache Anführungszeichen gesetzt und zu einem String. In setTimeout gibt es eine Funktion eval() zum Kompilieren des Strings. Wenn wir die Methode console.log() nicht in einfache Anführungszeichen setzen, wird die gesamte Funktion setTimeout() sofort ausgeführt, unabhängig davon, ob Verzögerungsparameter vorhanden sind. Genau wie diese Frage, die mir in Mideas Meiyun Smart Number-Interview begegnet ist:

console.log(1)

setTimeout(console.log(2),0)
  
console.log(3)
  
setTimeout(console.log(4),-1)

Das zurückgegebene Ergebnis ist 1 2 3 4. Wenn Sie es in einfache Anführungszeichen setzen, ist das zurückgegebene Ergebnis 1 3 2 4

Wenn Sie den setTimeout-Timer in js löschen möchten, benötigen Sie die Funktion clearTimeout(). Die spezifische Verwendung ist wie folgt:

var a = setTimeout('console.log(1)', 1)
clearTimeout(a)

Stellen Sie abschließend eine Frage, um zu sehen, ob Sie Ihren Abschluss gemacht haben. Vergleichen Sie die folgenden drei Codeteile, um die obige Ausgabe zu sehen:

for (var i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i);
    }, 0);
    console.log(i);
}
for (var i = 0; i < 3; i++) {
    setTimeout((function() {
        console.log(i);
    })(i), 0);
    console.log(i);
}
for (var i = 0; i < 3; i++) {
    setTimeout((function(i) {
        return function() {
            console.log(i);
        };
    })(i), 0);
    console.log(i);  
}

Diese Frage beschreibt einige Probleme mit dem JS-Bereich. Ich werde einen speziellen Artikel schreiben, um die Änderungen im Bereich in es5 und es6 vorzustellen.  

Das obige ist der detaillierte Inhalt vonsetTimeout()-Funktion in js. 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