2010-09-23 5 views
2

Avec le code suivant, j'obtiens une erreur clock is not defined, pourquoi?x n'est pas défini, problème setTimeout

$(function(){ 
    function clock() { 
     var nd = new Date(); 
     var h, m, s; 
     h = nd.getHours(); 
     m = nd.getMinutes(); 
     s = nd.getSeconds(); 
     if (h <= 9) h = "0" + h; 
     if (m <= 9) m = "0" + m; 
     if (s <= 9) s = "0" + s; 
     $('#digital-clock .hour').text(h+':'); 
     $('#digital-clock .min').text(m+':'); 
     $('#digital-clock .sec').text(s); 
    } 
    setTimeout('clock()', 1000); 
}); 

Répondre

9

Parce que quand vous passez une chaîne à setTimeout, le code à l'intérieur sera exécuté dans le contexte global au moment de l'expiration. Le code dans la portée globale n'a accès à aucune des variables locales présentes au moment où vous appelez setTimeout. Ne pas passer une chaîne à setTimeout, il aspire invariablement (c'est fondamentalement un eval différé, et nous détestons tous eval hein?). Au lieu d'utiliser un objet Function:

setTimeout(clock, 1000); 

vous pouvez utiliser une expression de fonction en ligne pour créer votre fonction aussi, par exemple:

setTimeout(function() { 
    var nd= new Date(); 
    ... 
}, 1000); 
+0

Les choses qui aspirent invariablement doivent toujours être évitées. – Pointy

6

Essayez ceci:

$(function(){ 
    function clock() { 
     var nd = new Date(); 
     var h, m, s; 
     h = nd.getHours(); 
     m = nd.getMinutes(); 
     s = nd.getSeconds(); 
     if (h <= 9) h = "0" + h; 
     if (m <= 9) m = "0" + m; 
     if (s <= 9) s = "0" + s; 
     $('#digital-clock .hour').text(h+':'); 
     $('#digital-clock .min').text(m+':'); 
     $('#digital-clock .sec').text(s); 
    } 
    setTimeout(clock, 1000); 
}); 
0

Quel est le problème avec ça?

$(function(){ 
    setTimeout(function() { 
     var nd = new Date(); 
     var h, m, s; 
     h = nd.getHours(); 
     m = nd.getMinutes(); 
     s = nd.getSeconds(); 
     if (h <= 9) h = "0" + h; 
     if (m <= 9) m = "0" + m; 
     if (s <= 9) s = "0" + s; 
     $('#digital-clock .hour').text(h+':'); 
     $('#digital-clock .min').text(m+':'); 
     $('#digital-clock .sec').text(s); 
    }, 1000); 
}); 

moins qu'il y ait une raison quelconque vous avez besoin de faire référence à la fonction par son nom plus tard ...?