357 votes

Passer des paramètres dans la fonction setInterval

Veuillez me conseiller sur la façon de passer des paramètres dans une fonction appelée à l'aide de setInterval .

Mon exemple setInterval(funca(10,3), 500); est incorrecte.

4 votes

Syntaxe : .setInterval(func, delay[, param1, param2, ...]);

611voto

tvanfosson Points 268301

Vous devez créer une fonction anonyme pour que la fonction réelle ne soit pas exécutée tout de suite.

setInterval( function() { funca(10,3); }, 500 );

4 votes

Quel devrait être le paramètre dynamique ?

31 votes

@rony36 - vous voulez probablement avoir une fonction qui crée le minuteur d'intervalle pour vous. Passez le paramètre à la fonction pour que sa valeur soit capturée dans la fermeture de la fonction et conservée pour le moment où le minuteur expire. function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); } Puis l'appeler comme createInterval(funca,dynamicValue,500); Bien entendu, vous pouvez étendre ce principe à plusieurs paramètres. Et, s'il vous plaît, utilisez des noms de variables plus descriptifs :)

0 votes

@tvanfosson : réponse géniale ! Savez-vous comment effacer le formulaire d'intervalle sur fonction funca ?

94voto

Kev Points 5046

Ajoutez-les comme paramètres à setInterval :

setInterval(funca, 500, 10, 3);

La syntaxe dans votre question utilise eval, qui n'est pas pratique recommandée .

3 votes

Whaa ?! Depuis quand est-ce que c'est autorisé ? (question sérieuse)

2 votes

Je ne suis pas sûr. Ma source était : developer.mozilla.org/fr/DOM/window.setInterval

2 votes

@Kev Internet Explorer est une vraie pagaille Il ne supporte pas le passage d'arguments -.-

89voto

sbr Points 1205

Maintenant avec ES5, méthode bind Prototype de fonction :

setInterval(funca.bind(null,10,3),500);

Référence ici

3 votes

C'est la meilleure réponse, mais elle peut avoir un comportement inattendu en fonction de la fonction, par ex. console.log.bind(null)("Log me") jettera Illegal invocation mais console.log.bind(console)("Log me") fonctionnera comme prévu. Cela est dû au fait que console.log nécessite console comme le this arg.

1 votes

De loin la meilleure réponse. Maigre et propre. Merci beaucoup !

0 votes

Très propre et efficace !

33voto

Juan Points 201

Vous pouvez passer le(s) paramètre(s) comme une propriété de l'objet fonction, et non comme un paramètre :

var f = this.someFunction;  //use 'this' if called from class
f.parameter1 = obj;
f.parameter2 = this;
f.parameter3 = whatever;
setInterval(f, 1000);

Ensuite, dans votre fonction someFunction vous aurez accès aux paramètres. Ceci est particulièrement utile dans les classes où la portée passe automatiquement à l'espace global et où vous perdez les références à la classe qui a appelé setInterval pour commencer. Avec cette approche, "parameter2" dans "someFunction", dans l'exemple ci-dessus, aura la bonne portée.

1 votes

Vous pouvez y accéder par Classname.prototype.someFunction.parameter1

3 votes

L'ajout de paramètres à un objet ou à une fonction peut ralentir le compilateur, car il devra reconstruire la représentation de l'objet en code natif (par exemple si cela a été fait dans une boucle chaude).

18voto

Simon Points 22764

Vous pouvez utiliser une fonction anonyme ;

setInterval(function() { funca(10,3); },500);

1 votes

C'est un appel assez coûteux !

3 votes

@Roylee Comment est-ce que c'est cher ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X