J'apprends JavaScript et j'ai récemment appris les événements de synchronisation JavaScript. Quand j'ai appris setTimeout
à W3Schools , j'ai remarqué un étrange personnage que je ne courais pas en avant. Ils utilisent des guillemets doubles et appellent ensuite la fonction.
Exemple:
setTimeout("alertMsg()", 3000);
Je sais que les guillemets doubles et simples en JavaScript signifient une chaîne.
J'ai aussi vu que je peux faire la même chose comme ça:
setTimeout(alertMsg, 3000);
Avec les parenthèses, il fait référence, sans les parenthèses, il est copié. Quand j'utilise les guillemets et les parenthèses, ça devient fou.
Je serai heureux si quelqu'un peut m'expliquer la différence entre ces trois façons d'utiliser setTimeout
:
Avec les parenthèses:
setTimeout("alertMsg()", 3000);
Sans les guillemets et les parenthèses:
setTimeout(alertMsg, 3000);
Et le troisième utilise uniquement des guillemets:
setTimeout("alertMsg", 3000);
NB: Une meilleure source de setTimeout
référence serait MDN .
la source
mysql_
extension de PHP) dont le flux de questions SO n'est qu'un exemple. IIRC il y a eu aussi des erreurs très subtiles dans la section SQL, mais cela fait presque un an depuis la dernière fois que j'ai visité le site Web et beaucoup d'entre elles pourraient aussi bien être corrigées. Et même si tout était parfait, je ne ferais pas encore la promotion d'un site Web qui essaie de tromper les gens avec la fraude de leur certificat.Réponses:
Utilisation de
setInterval
ousetTimeout
Vous devez passer une référence à une fonction comme premier argument pour
setTimeout
ousetInterval
. Cette référence peut prendre la forme de:Une fonction anonyme
Un nom d'une fonction existante
Une variable qui pointe vers une fonction existante
Notez que j'ai défini "variable dans une fonction" séparément de "nom de la fonction". Il n'est pas évident que les variables et les noms de fonction occupent le même espace de noms et peuvent s'encombrer.
Passer des arguments
Pour appeler une fonction et transmettre des paramètres, vous pouvez appeler la fonction dans le rappel affecté au temporisateur:
Il existe une autre méthode pour passer des arguments dans le gestionnaire, mais elle n'est pas compatible avec tous les navigateurs .
Contexte de rappel
Par défaut, le contexte du rappel (la valeur de l'
this
intérieur de la fonction appelée par le temporisateur) lorsqu'il est exécuté est l'objet globalwindow
. Si vous souhaitez le modifier, utilisezbind
.Sécurité
Bien que ce soit possible, vous ne devez pas passer de chaîne à
setTimeout
ousetInterval
. La transmission d'une chaîne créesetTimeout()
ousetInterval()
utilise une fonctionnalité similaire àeval()
celle qui exécute les chaînes en tant que scripts , ce qui rend possible l'exécution de scripts arbitraires et potentiellement dangereux.la source
je pense que la fonction setTimeout que vous écrivez n'est pas en cours d'exécution. si vous utilisez jquery, vous pouvez le faire fonctionner correctement en procédant comme suit:
la source
Tout à fait d'accord avec Joseph.
Voici un violon pour tester ceci: http://jsfiddle.net/nicocube/63s2s/
Dans le contexte du violon, l'argument chaîne ne fonctionne pas, à mon avis, car la fonction n'est pas définie dans la portée globale.
la source
Que se passe-t-il en réalité si vous passez une chaîne comme premier paramètre de fonction
est la valeur du premier paramètre obtenu évalué quand il est temps de s'exécuter (après le passage
number
des millisecondes). Fondamentalement, il est égal àC'est
Les échantillons que vous référez ne sont donc pas de bons échantillons et peuvent être donnés dans un contexte différent ou simplement par une simple faute de frappe.
Si vous invoquez comme ceci
setTimeout(something, number)
, le premier paramètre n'est pas une chaîne, mais un pointeur sur quelque chose appelésomething
. Et encore sisomething
est une chaîne - alors elle sera évaluée. Mais si c'est une fonction, alors la fonction sera exécutée. échantillon jsbinla source
la source
Avec les parenthèses:
Sans les guillemets et les parenthèses:
Et le troisième utilise uniquement des guillemets:
la source