var until = $("#time").html();
function updateTime() {
$("#time").html(
date("d", until) + " day(s)<br />" +
date("h", until) + " hour(s)<br />" +
date("i", until) + " minute(s)<br />" +
date("s", until) + " second(s)"
);
}
setInterval("updateTime(until)",1000);
Everytime I run this, I get this error:
Uncaught ReferenceError: until is not defined
(anonymous function)
I can't see whats wrong. I've tried to google a lot, but every page that I find, says that setInterval() is right.
6 Réponses :
fermetures:
Oh mon Dieu panique, tu m'as sauvé de la folie que je suis à 1 heure de ma présentation. Cheers frère! :)
Vous utilisez une forme d'évaluation. Utilisation:
setInterval(updateTime,1000);
Le problème est que vous passez le code à Si vous passez une fonction dans, cela signifie que la variable seinterval code> comme chaîne. Cela signifie qu'il est évalué dans la portée globale. La variable jusqu'à code> n'existe pas dans la portée globale, uniquement dans la portée où elle est définie. jusqu'à ce que code> soit Disponible (c'est "fermé dans"): p>
L'explication logique serait que la variable sur la manière dont vous devez modifier votre code, cela dépend de la mise à jour de la valeur jusqu'à la mise à jour de jusqu'à ce que la fonction d'intervalle soit appelée ou si vous souhaitez la capturer une seule fois avant que cela ne fonctionne jamais et utilisez cette valeur pour tous. Invocations ultérieures de l'intervalle de minuterie. Votre code est un peu ambigu pour lequel vous voulez que cela fonctionne (la capturer dans une variable une fois, mais essayant ensuite de le transmettre à chaque fois). Si vous ne voulez pas que la valeur ne soit jamais mise à jour, vous pouvez le faire comme ceci: p> Ceci capturera la portée de J'ai également apporté l'appel de jusqu'à ce que code> ne soit pas une variable globale. Si ce n'est pas global (ou capturé dans une fermeture de fonction pertinente), il n'existera pas encore lorsque le seinterval déclenche et essaie d'évaluer la chaîne que vous avez transmise en tant qu'appel de fonction. Ce n'est pas non plus une bonne pratique de transmettre une chaîne à seinterval, vous devez passer une fonction javascript réelle. jusqu'à code > Dans une fermeture de la fonction et mettez-la à la disposition de la fonction de rappel intervalle anonyme. Mettez-le dans une chaîne comme si vous le faisiez avant de ne pas créer une telle fermeture. P> UpdateTime (jusqu'à) code> correspond à la déclaration de votre UpdateTime () code> fonction. p> p>
setInterval a une portée globale, donc je suppose que jusqu'à ce que cela ne soit pas défini dans la portée mondiale. Changer votre code aux deux suivants fonctionnera. Je crois que c'est ce que vous essayez de faire.
function updateTime(until){
$("#time").html(
date("d", until) + " day(s)<br />" +
date("h", until) + " hour(s)<br />" +
date("i", until) + " minute(s)<br />" +
date("s", until) + " second(s)");
}
setInterval(function() { updateTime($("#time").html()) }, 1000);
Vous pouvez également l'écrire comme une expression de Lambda comme celle-ci: p>
seinterval (() => updateTime, 1000); code> p>
Votre fonction
updateTime () code> ne prend aucun paramètre dans lesetInterval code> Vous essayez de passer un. Ce n'est peut-être pas la raison de cette erreur spécifique, mais il a toujours besoin de corriger.Je jure ceci dans des doublons exacts. De quelque manière que ce soit, ceci est proche: Stackoverflow.com/questions/5766285/SetInval-and -fonction