7
votes

seinterval ne fonctionne pas?

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.

2 commentaires

Votre fonction updateTime () ne prend aucun paramètre dans le setInterval 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


6 Réponses :


20
votes

fermetures: xxx


1 commentaires

Oh mon Dieu panique, tu m'as sauvé de la folie que je suis à 1 heure de ma présentation. Cheers frère! :)



0
votes

Vous utilisez une forme d'évaluation. Utilisation:

setInterval(updateTime,1000);


0 commentaires

5
votes

Le problème est que vous passez le code à seinterval comme chaîne. Cela signifie qu'il est évalué dans la portée globale. La variable jusqu'à n'existe pas dans la portée globale, uniquement dans la portée où elle est définie.

Si vous passez une fonction dans, cela signifie que la variable jusqu'à ce que soit Disponible (c'est "fermé dans"): xxx


0 commentaires

1
votes

L'explication logique serait que la variable jusqu'à ce que 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.

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: xxx

Ceci capturera la portée de jusqu'à 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.

J'ai également apporté l'appel de UpdateTime (jusqu'à) correspond à la déclaration de votre UpdateTime () fonction.


0 commentaires

0
votes

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);


0 commentaires

1
votes

Vous pouvez également l'écrire comme une expression de Lambda comme celle-ci:

seinterval (() => updateTime, 1000);


0 commentaires