Pourquoi cette erreur "Uncaught ReferenceError: tempo n'est pas définie"?

J'ai le code suivant:

$("#avvia_cronometro").click(function() { var tempo = setInterval(function() { cronometro(); $("#tempo_cronometro").html((h)+":"+(min)+":"+(sec)); }, 1000); }); $("#stop_cronometro").click(function() { clearInterval(tempo); }); function cronometro() { if (sec == 59) { min +=1; if (min == 59) { h+=1; min=0; } sec=0; } sec+=1; } 

Lorsque je clique sur #stop_cronometro cela ne fonctionne pas et il dit:

 Uncaught ReferenceError: tempo is not defined 

Comment puis-je réparer?

Si je clique sur #avvia_cronometro il commence par l'heure, donc c'est un travail.

Étant donné qu'il n'y a pas de tempo variable qui existe dans la portée globale (ou toute portée que le gestionnaire de clic d'arrêt peut atteindre).

Lorsque vous déclarez une variable avec var dans une fonction, cette variable est supprimée lorsque la fonction retourne:

 function foo () { var bar = 1; } foo(); console.log(bar); // uncaught reference error - "bar" doesn't exist 

Si vous avez besoin d'une variable globale, utilisez-la sans la var :

 function foo () { bar = 1; } foo(); console.log(bar); // prints 1 

Cependant, je ne le recommandais généralement pas, car il semble qu'une erreur pour les responsables futurs. Au lieu de cela, déclarer la variable globale explicitement dans la portée globale pour montrer clairement votre intention:

 var bar = null; function foo() { bar = 1; } foo(); console.log(bar); // prints 1 

Bien, cela se produit parce que la portée variable dans des fonctions distinctes, lorsqu'une variable est déclarée dans une fonction, elle ne sera accessible qu'à elle-même et les fonctions enfant.

Dans votre cas, je vous suggère de faire de la variable "tempo" globale:

 var tempo = null; $("#avvia_cronometro").click(function() { tempo = setInterval(function() { cronometro(); $("#tempo_cronometro").html((h)+":"+(min)+":"+(sec)); }, 1000); }); $("#stop_cronometro").click(function() { clearInterval(tempo); }); function cronometro() { if (sec == 59) { min +=1; if (min == 59) { h+=1; min=0; } sec=0; } sec+=1; } 

Parce que vous étiez en train d'effacer l'intervalle avant qu'il ne commence à s'exécuter. Gérer le tempo indéfini dans si. SetInterval est un appel asynchronus.