Réponses:
Vous devez créer une fonction anonyme pour que la fonction réelle ne soit pas exécutée immédiatement.
setInterval( function() { funca(10,3); }, 500 );
function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); }
Ensuite, appelez-le comme createInterval(funca,dynamicValue,500);
vous pouvez évidemment l'étendre pour plus d'un paramètre. Et, s'il vous plaît, utilisez des noms de variables plus descriptifs. :)
funca
?
maintenant avec ES5, méthode de liaison Prototype de fonction:
setInterval(funca.bind(null,10,3),500);
console.log.bind(null)("Log me")
va lancer Illegal invocation
, mais console.log.bind(console)("Log me")
fonctionnera comme prévu. C'est parce que console.log
requiert console
comme this
argument.
Ajoutez-les en tant que paramètres à setInterval:
setInterval(funca, 500, 10, 3);
La syntaxe de votre question utilise eval, ce qui n'est pas une pratique recommandée.
Vous pouvez passer le (s) paramètre (s) en tant que propriété de l'objet fonction, pas en tant que 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 va automatiquement à l'espace global et 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.
setInterval(function(a,b,c){
console.log(a + b +c);
}, 500, 1,2,3);
//note the console will print 6
//here we are passing 1,2,3 for a,b,c arguments
// tested in node v 8.11 and chrome 69
Vous pouvez utiliser une fonction anonyme;
setInterval(function() { funca(10,3); },500);
setInterval(function,milliseconds,param1,param2,...)
Mise à jour: 2018 - utilisez l'opérateur "spread"
function repeater(param1, param2, param3){
alert(param1);
alert(param2);
alert(param3);
}
let input = [1,2,3];
setInterval(repeater,3000,...input);
La réponse de loin la plus pratique est celle donnée par tvanfosson, tout ce que je peux faire est de vous donner une version mise à jour avec ES6:
setInterval( ()=>{ funca(10,3); }, 500);
Citer les arguments devrait suffire:
OK --> reloadIntervalID = window.setInterval( "reloadSeries('"+param2Pass+"')" , 5000)
KO --> reloadIntervalID = window.setInterval( "reloadSeries( "+param2Pass+" )" , 5000)
Notez la citation unique '
pour chaque argument.
Testé avec IE8, Chrome et FireFox
Je sais que ce sujet est tellement ancien mais voici ma solution pour passer des paramètres en setInterval
fonction.
Html:
var fiveMinutes = 60 * 2;
var display = document.querySelector('#timer');
startTimer(fiveMinutes, display);
JavaScript:
function startTimer(duration, display) {
var timer = duration,
minutes, seconds;
setInterval(function () {
minutes = parseInt(timer / 60, 10);
seconds = parseInt(timer % 60, 10);
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
display.textContent = minutes + ":" + seconds;
--timer; // put boolean value for minus values.
}, 1000);
}
timer
), mais comment faites-vous clearInterval()
dans ce scénario?
Vous pouvez utiliser une bibliothèque appelée underscore js. Il donne un bon emballage sur la méthode de liaison et est également une syntaxe beaucoup plus propre. Vous permettant d'exécuter la fonction dans la portée spécifiée.
_.bind (fonction, portée, * arguments)
Ce problème serait une belle démonstration de l'utilisation des fermetures. L'idée est qu'une fonction utilise une variable de portée externe. Voici un exemple...
setInterval(makeClosure("Snowden"), 1000)
function makeClosure(name) {
var ret
ret = function(){
console.log("Hello, " + name);
}
return ret;
}
La fonction "makeClosure" renvoie une autre fonction, qui a accès à la variable de portée externe "nom". Donc, fondamentalement, vous devez transmettre toutes les variables à la fonction "makeClosure" et les utiliser dans la fonction affectée à la variable "ret". Affectueusement, setInterval exécutera la fonction affectée à "ret".
J'ai eu le même problème avec l'application Vue. Dans mon cas, cette solution ne fonctionne que si la fonction anonyme a déclaré comme fonction flèche, en ce qui concerne la déclaration au mounted ()
crochet du cercle de vie.
.setInterval(func, delay[, param1, param2, ...]);