Veuillez indiquer comment passer des paramètres à une fonction appelée à l'aide de setInterval
.
Mon exemple setInterval(funca(10,3), 500);
est incorrect.
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 );
maintenant avec ES5, méthode bind Prototype de fonction:
setInterval(funca.bind(null,10,3),500);
Ajoutez-les en tant que paramètres à setInterval:
setInterval(funca, 500, 10, 3);
La syntaxe utilisée dans 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, et non 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. Cela est particulièrement utile dans les classes où la portée se place automatiquement dans l'espace global et vous perdez les références à la classe qui a appelé setInterval. Avec cette approche, "paramètre2" dans "uneFonction", dans l'exemple ci-dessus, aura la bonne portée.
Vous pouvez utiliser une fonction anonyme.
setInterval(function() { funca(10,3); },500);
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
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);
De loin la réponse 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 le guillemet simple '
pour chaque argument.
Testé avec IE8, Chrome et FireFox
Je sais que ce sujet est si ancien, mais voici ma solution pour passer des paramètres dans la fonction setInterval
.
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);
}
Vous pouvez utiliser une bibliothèque appelée underscore js. Cela donne un wrapper Nice sur la méthode bind et une syntaxe beaucoup plus nette. Vous permettant d'exécuter la fonction dans la portée spécifiée.
_.bind (fonction, portée, * arguments)
Cela fonctionne setInterval("foo(bar)",int,lang);
.... Jon Kleiser m'amène à la réponse.
Ce problème serait une démonstration de Nice pour 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 périmètre externe "name". Donc, fondamentalement, vous devez passer n'importe quelle variable à la fonction "makeClosure" et les utiliser dans la fonction affectée à la variable "ret". Fait intéressant, setInterval exécutera la fonction affectée à "ret".
Une autre solution consiste à transmettre votre fonction comme ça (si vous avez des variables dynamiques):