Risposte:
È necessario creare una funzione anonima in modo che la funzione effettiva non venga eseguita immediatamente.
setInterval( function() { funca(10,3); }, 500 );
function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); }
Quindi chiamalo come createInterval(funca,dynamicValue,500);
Ovviamente puoi estenderlo per più di un parametro. E, per favore, usa nomi di variabili più descrittivi. :)
funca
?
ora con ES5, metodo bind prototipo di funzione:
setInterval(funca.bind(null,10,3),500);
console.log.bind(null)("Log me")
lancerà Illegal invocation
, ma console.log.bind(console)("Log me")
funzionerà come previsto. Questo perché console.log
richiede console
come this
arg.
Aggiungili come parametri per setInterval:
setInterval(funca, 500, 10, 3);
La sintassi nella tua domanda usa eval, che non è una pratica consigliata.
È possibile passare i parametri come proprietà dell'oggetto funzione, non come parametro:
var f = this.someFunction; //use 'this' if called from class
f.parameter1 = obj;
f.parameter2 = this;
f.parameter3 = whatever;
setInterval(f, 1000);
Quindi, nella tua funzione someFunction
, avrai accesso ai parametri. Ciò è particolarmente utile all'interno delle classi in cui l'ambito si sposta automaticamente nello spazio globale e si perderanno i riferimenti alla classe che ha chiamato setInterval. Con questo approccio, "parametro2" in "someFunction", nell'esempio sopra, avrà l'ambito giusto.
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
Puoi usare una funzione anonima;
setInterval(function() { funca(10,3); },500);
setInterval(function,milliseconds,param1,param2,...)
Aggiornamento: 2018: utilizzare l'operatore "spread"
function repeater(param1, param2, param3){
alert(param1);
alert(param2);
alert(param3);
}
let input = [1,2,3];
setInterval(repeater,3000,...input);
Di gran lunga la risposta più pratica è quella data da tvanfosson, tutto quello che posso fare è darti una versione aggiornata con ES6:
setInterval( ()=>{ funca(10,3); }, 500);
La citazione degli argomenti dovrebbe essere sufficiente:
OK --> reloadIntervalID = window.setInterval( "reloadSeries('"+param2Pass+"')" , 5000)
KO --> reloadIntervalID = window.setInterval( "reloadSeries( "+param2Pass+" )" , 5000)
Nota la singola citazione '
per ogni argomento.
Testato con IE8, Chrome e FireFox
So che questo argomento è così vecchio ma ecco la mia soluzione sul passaggio di parametri in setInterval
funzione.
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
), ma come si fa clearInterval()
in questo scenario?
Puoi usare una libreria chiamata underscore js. Fornisce un buon wrapper sul metodo bind ed è anche una sintassi molto più pulita. Permettendo di eseguire la funzione nell'ambito specificato.
_.bind (funzione, ambito, * argomenti)
Quel problema sarebbe una bella dimostrazione per l'uso delle chiusure. L'idea è che una funzione utilizza una variabile di ambito esterno. Ecco un esempio ...
setInterval(makeClosure("Snowden"), 1000)
function makeClosure(name) {
var ret
ret = function(){
console.log("Hello, " + name);
}
return ret;
}
La funzione "makeClosure" restituisce un'altra funzione, che ha accesso alla variabile dell'ambito esterno "name". Quindi, in sostanza, è necessario passare qualsiasi variabile alla funzione "makeClosure" e usarli nella funzione assegnata alla variabile "ret". Affettuosamente, setInterval eseguirà la funzione assegnata a "ret".
Ho avuto lo stesso problema con l'app Vue. Nel mio caso questa soluzione funziona solo se la funzione anonima è stata dichiarata come funzione freccia, per quanto riguarda la dichiarazione mounted ()
all'amo del cerchio di vita.
.setInterval(func, delay[, param1, param2, ...]);