2010-02-18 2 views
11

J'ai le code comme ceci:À quoi sert la fonction donnée à setTimeout?

setTimeout(foo, 600); 

J'ai toujours pensé que foo n'a pas pris des arguments, par exemple:

function foo() { /* bars */ } 

Cependant, procédez comme suit:

function foo(a) { alert(a); /* bars */ } 

Popped jusqu'à une alerte affichant -7. Que représente ce nombre?

+1

Bonne question! Je n'avais jamais pensé à essayer ça avant. – Nicole

Répondre

8

C'est la différence de temps (en millisecondes) entre le moment où il a été programmé pour l'exécuter et le moment où il a réellement été exécuté.

alert(setTimeout(function(a) { alert(a) }, 2000)); 

Si vous désactivez la première alerte en temps, vous verrez la prochaine alerte est quelque part -10 à 10. Si vous attendez quelques secondes, vous verrez quelque chose qui est à l'époque vous avez attendu moins 2000.

La même chose peut être vue pour setInterval. Exécutez ce qui suit dans Firebug:

setInterval(function(a) { alert(a); }, 2000); 

Essayez de fermer l'alerte rapidement, il sera de nouveau à 0 environ. Laissez-le ouvert - il vous donnera une grande valeur.

Remarque Ceci est sur Firefox Mac, où en gardant un ouvert alerte arrêtera le traitement de Javascript, de sorte que la minuterie n'exécute pas jusqu'à ce que je ferme l'alerte. Le comportement des tests ci-dessus peut être différent dans d'autres navigateurs

+0

oui .. il est documenté d'une manière très mineure ici: https://developer.mozilla.org/en/DOM/window.setTimeout. On dirait que c'est une chose de Firefox seulement – Claudiu

+0

Tout à fait une fonctionnalité intelligente, la honte IE ne l'a pas aussi. Là encore, c'est dommage que IE n'ait pas beaucoup de choses :-) –

+1

@Andy E Si vous regardez https://bugzilla.mozilla.org/show_bug.cgi?id=394769 il semble qu'il y ait une controverse sur son existence du tout, car il réduit la facilité d'utilisation des fonctions avec des arguments optionnels appelés par setTimeout. – Nicole

3

D'après ce que je peux dire ... l'argument dans la différence entre quand il a été planifié et quand il a effectivement couru en millisecondes. Il est intéressant, semble certains navigateurs comme même quelques fractions de secondes entières ...

<script> 
var a = setInterval(foo, 125); 

console.log(a); 

function foo(b) { 
console.log(b); 
} 
</script> 

Affichera un tas de zéros, même pour 250, 500, 1000 ... alors que

<script> 
var a = setInterval(foo, 127); 

console.log(a); 

function foo(b) { 
console.log(b); 
} 
</script> 

Affichera

-2 
12 
-6 
8 
-10 
4 
2 
0 
-2 
-4 
9 
-8 
5 
3 
1