Javascript setInterval ne fonctionne pas

J'ai besoin d'exécuter une fonction javascript toutes les 10 Secondes.

Je comprends que la syntaxe doit fonctionner comme suit mais je n'obtiens aucun succès:

function funcName() {
    alert("test");
}

var func = funcName();
var run = setInterval("func",10000)

, Mais ce n'est pas de travail. Toute aide?

23
demandé sur ThiefMaster 2012-01-08 22:00:40

4 réponses

Beaucoup d'autres réponses se concentrent sur un modèle qui fonctionne, mais leurs explications ne sont pas vraiment très complètes quant à la raison pour laquelle votre code actuel ne fonctionne pas.

Votre code, pour référence:

function funcName() {
    alert("test");
}

var func = funcName();
var run = setInterval("func",10000)

Divisons ça en morceaux. Votre fonction funcName est bien. Notez que lorsque vous appelez funcName (en d'autres mots, vous l'exécuter) vous sera d'alerte "test". Mais notez que funcName() - les parenthèses signifient "appeler" ou "exécuter" la fonction - ne renvoie pas réellement une valeur. Lorsqu'un la fonction n'a pas de valeur de retour, elle est par défaut appelée undefined.

Lorsque vous appelez une fonction, vous ajoutez sa liste d'arguments à la fin entre parenthèses. Lorsque vous n'avez aucun argument pour passer la fonction, vous ajoutez simplement des parenthèses vides, comme funcName(). Mais quand vous voulez vous référer à la fonction elle-même, et ne pas l'appeler, vous n'avez pas besoin des parenthèses car les parenthèses indiquent pour l'exécuter.

Donc, quand vous dites:

var func = funcName();

Vous déclarez réellement un variable {[14] } qui a une valeur de funcName(). Mais remarquez les parenthèses. funcName() est en fait la valeur de retour de funcName. Comme je l'ai dit plus haut, puisque funcName ne renvoie aucune valeur, il est par défaut undefined. Donc, en d'autres termes, votre variable func aura réellement la valeur undefined.

Alors vous avez cette ligne:

var run = setInterval("func",10000)

La fonction setInterval prend deux arguments. Le premier est la fonction à exécuter de temps en temps, et le second est le nombre de millisecondes entre chaque fois la fonction est exécuté.

Cependant, le premier argument devrait vraiment être une fonction, pas une chaîne. Si c'est une chaîne, alors le moteur JavaScript utilisera eval sur cette chaîne à la place. Donc, en d'autres termes, votre setInterval exécute le code JavaScript suivant:

func
// 10 seconds later....
func
// and so on

Cependant, func est juste une variable (avec la valeur undefined, mais ce n'est pas pertinent). Ainsi, toutes les dix secondes, le moteur JS évalue la variable func et renvoie undefined. Mais ce n'est pas vraiment le faire quoi. Je veux dire, techniquement, il est évalué toutes les 10 secondes, mais vous n'allez pas voir d'effets de cela.

La solution consiste à donner à setInterval une fonction à exécuter au lieu d'une chaîne. Donc, dans ce cas:

var run = setInterval(funcName, 10000);

Remarquez que je ne l'ai pas donné func. C'est parce que func est pas une fonction dans votre code, c'est la valeur de undefined, parce que vous l'avez attribuée funcName(). Comme je l'ai dit plus haut, funcName() appellera la fonction funcName et retournera la valeur de retour de la fonction. Comme funcName ne renvoie rien, la valeur par défaut est undefined. Je sais que je l'ai dit plusieurs fois maintenant, mais c'est vraiment un concept très important: quand vous voyez funcName(), Vous devriez penser "la valeur de retour de funcName". Lorsque vous voulez faire référence à une fonction elle-même, comme une entité distincte, vous devez laisser les parenthèses pour ne pas l'appeler: funcName.

Donc, une autre solution pour votre code serait:

var func = funcName;
var run = setInterval(func, 10000);

Cependant, c'est un peu redondant: pourquoi utiliser func au lieu de funcName?

Ou vous pouvez rester aussi vrai que possible au code original en modifiant deux bits:

var func = funcName;
var run = setInterval("func()", 10000);

Dans ce cas, le moteur JS évaluera func() toutes les dix secondes. En d'autres termes, il alertera "test", toutes les dix secondes. Cependant, comme le dit la célèbre phrase, eval est mauvais , donc vous devriez essayer de l'éviter autant que possible.

Une autre torsion sur ce code est d'utiliser une fonction anonyme. En d'autres termes, une fonction qui n'ont pas un nom -- vous le déposez simplement dans le code parce que vous ne vous souciez pas de son nom.

setInterval(function () {
    alert("test");
}, 10000);

Dans ce cas, puisque je ne me soucie pas de ce que la fonction est appelée, je laisse juste une fonction générique, sans nom (anonyme) là.

100
répondu Reid 2012-01-08 18:21:38

Modifier setInterval("func",10000) soit setInterval(funcName, 10000) ou setInterval("funcName()",10000). La première est la méthode recommandée.

5
répondu techfoobar 2012-01-08 18:04:30

C'est parce que vous devriez passer une fonction, pas une chaîne:

function funcName() {
    alert("test");
}

setInterval(funcName, 10000);

Votre code a deux problèmes:

  • var func = funcName(); appelle immédiatement la fonction et attribue la valeur de retour.
  • juste {[2] } est invalide même si vous utilisez la syntaxe de type eval mauvaise et obsolète de setInterval. Ce serait setInterval("func()", 10000) d'appeler la fonction eval-like.
3
répondu ThiefMaster 2012-01-08 18:12:20

Essayez ceci:

function funcName() {
    alert("test");
}

var run = setInterval(funcName, 10000)
2
répondu qwertymk 2012-01-08 18:02:18