Ich lerne JavaScript und habe kürzlich etwas über JavaScript-Timing-Ereignisse gelernt. Als ich setTimeout
bei W3Schools davon erfuhr , bemerkte ich eine seltsame Figur, die ich vorher nicht kennengelernt hatte. Sie verwenden doppelte Anführungszeichen und rufen dann die Funktion auf.
Beispiel:
setTimeout("alertMsg()", 3000);
Ich weiß, dass doppelte und einfache Anführungszeichen in JavaScript eine Zeichenfolge bedeuten.
Ich habe auch gesehen, dass ich das auch so machen kann:
setTimeout(alertMsg, 3000);
Mit den Klammern bezieht es sich, ohne die Klammern wird es kopiert. Wenn ich die Anführungszeichen und Klammern verwende, wird es verrückt.
Ich würde mich freuen, wenn mir jemand den Unterschied zwischen diesen drei Verwendungsmöglichkeiten erklären kann setTimeout
:
Mit den Klammern:
setTimeout("alertMsg()", 3000);
Ohne die Anführungszeichen und Klammern:
setTimeout(alertMsg, 3000);
Und der dritte verwendet nur Anführungszeichen:
setTimeout("alertMsg", 3000);
NB: Eine bessere setTimeout
Referenzquelle wäre MDN .
quelle
mysql_
Erweiterung von PHP) zu halten, für die der SO-Fragenstrom nur ein Beispiel ist. IIRC gab es auch einige sehr subtile Fehler im SQL-Bereich, aber es ist fast ein Jahr her, seit ich die Website das letzte Mal besucht habe, und viele davon können auch behoben werden. Und selbst wenn alles oben Genannte perfekt wäre, würde ich keine Website bewerben, die versucht, Menschen mit dem Betrug ihres Zertifikats zu täuschen.Antworten:
Verwenden von
setInterval
odersetTimeout
Sie sollten einen Verweis auf eine Funktion als erstes Argument für
setTimeout
oder übergebensetInterval
. Diese Referenz kann in Form von:Eine anonyme Funktion
Ein Name einer vorhandenen Funktion
Eine Variable, die auf eine vorhandene Funktion verweist
Beachten Sie, dass ich "Variable in einer Funktion" getrennt von "Funktionsname" setze. Es ist nicht ersichtlich, dass Variablen und Funktionsnamen denselben Namespace belegen und sich gegenseitig überladen können.
Argumente übergeben
Um eine Funktion aufzurufen und Parameter zu übergeben, können Sie die Funktion innerhalb des dem Timer zugewiesenen Rückrufs aufrufen:
Es gibt eine andere Methode, um Argumente an den Handler zu übergeben, die jedoch nicht browserübergreifend kompatibel ist .
Rückrufkontext
Standardmäßig ist der Kontext des Rückrufs (der Wert
this
innerhalb der vom Timer aufgerufenen Funktion) bei der Ausführung das globale Objektwindow
. Wenn Sie es ändern möchten, verwenden Siebind
.Sicherheit
Obwohl es möglich ist, sollten Sie keine Zeichenfolge an
setTimeout
oder übergebensetInterval
. String übergeben machtsetTimeout()
odersetInterval()
eine ähnliche Funktionalität wie verwenden ,eval()
dass ausführt Strings als Skripte , so dass beliebig und potenziell schädliche Skriptausführung möglich.quelle
Ich denke, die setTimeout-Funktion, die Sie schreiben, wird nicht ausgeführt. Wenn Sie jquery verwenden, können Sie es folgendermaßen korrekt ausführen:
quelle
Stimme Joseph vollkommen zu.
Hier ist eine Geige, um dies zu testen: http://jsfiddle.net/nicocube/63s2s/
Im Kontext der Geige funktioniert das String-Argument meiner Meinung nach nicht, da die Funktion nicht im globalen Bereich definiert ist.
quelle
Was passiert in der Realität, wenn Sie einen String als ersten Funktionsparameter übergeben?
Der Wert des ersten Parameters wurde ausgewertet, wenn er ausgeführt werden soll (nach Ablauf der verstrichenen Millisekunden
number
). Grundsätzlich ist es gleichDas ist
Beispiele, auf die Sie sich beziehen, sind also keine guten Beispiele und können in einem anderen Kontext oder einfach nur als Tippfehler angegeben werden.
Wenn Sie so aufrufen
setTimeout(something, number)
, ist der erste Parameter kein String, sondern ein Zeiger auf etwas, das aufgerufen wirdsomething
. Und wieder, wennsomething
es ein String ist, wird er ausgewertet. Wenn es sich jedoch um eine Funktion handelt, wird die Funktion ausgeführt. jsbin Probequelle
quelle
Mit den Klammern:
Ohne die Anführungszeichen und Klammern:
Und der dritte verwendet nur Anführungszeichen:
quelle