2011-02-25 2 views
0

J'ai une fonction dormir en javascript comme ci-dessous:pourquoi setTimeout est pas exécuté en javascript

var is_sleep = true; 
function sleep(time){ 
    if (is_sleep){ 
    is_sleep = false; 
    setTimeout("sleep(time)", time); 
    }else{ 
    is_sleep = true; 
    } 
} 
sleep(3000); 

Cependant, il passe par les déclarations pour is_sleep = true, ne passe pas par des déclarations de is_sleep = faux et doesn ne dors plus.

Quelqu'un pourrait dire quelle est la raison? Merci d'avance.

Répondre

6

Il est probable que setTimeout soit appelé, mais la chaîne qui lui est transmise échoue, car la portée ne contiendra plus time, auquel vous faites référence. Essayez de remplacer cette ligne avec ceci:

setTimeout(function() { sleep(time); }, time); 

... qui définit une fermeture, qui utilise la bonne portée. Vous pouvez également essayer ceci:

setTimeout(sleep, time, time); 

... qui passera time comme argument pour sleep.

+0

vous êtes très cool! avec votre aide, ça a marché! – ywenbo

+0

merci beaucoup. Pourriez-vous me dire pourquoi le temps passé dans "le sommeil" n'est pas la durée? Je ne comprends pas même si cela a fonctionné, :-) – ywenbo

+0

@ywenbo: Bien sûr. Lorsque vous passez une chaîne en paramètre à 'setTimeout', lorsque le délai expire, il l'évalue dans la portée de' window'. 'time' ne sera pas dans la portée de' window'; il sera dans la portée maintenant inaccessible de 'sommeil '. Si vous utilisez une fermeture, elle hérite de la portée à partir de laquelle elle est définie. Si vous utilisez la seconde méthode, il passe 'sleep' comme référence et dit' setTimeout' pour lui passer 'time' comme argument. – icktoofay

2

setTimeout exécute asynchronously ce qui signifie qu'il ne bloque pas l'exécution de votre code. Peut-être que vous le saviez, mais la fonction ne sera jamais à la hauteur du nom que vous avez choisi pour cela.

premier appel sleep(3000); appelle la fonction de sommeil, ce qui rend la variable is_sleepfalse, réglage d'une minuterie, puis retourne immédiatement l'exécution de code (pour tout ce qui vient après sleep(3000);;))

Si setTimeout a été appelé correctement (setTimeout(sleep,time,time);), après 3 secondes, la fonction serait à nouveau appelée réglage is_sleep retour à true.