Passa i parametri nella funzione setInterval


320

Si prega di avvisare come passare i parametri in una funzione chiamata using setInterval.

Il mio esempio setInterval(funca(10,3), 500);non è corretto.


2
Sintassi:.setInterval(func, delay[, param1, param2, ...]);
O-9, 9

Risposte:


543

È necessario creare una funzione anonima in modo che la funzione effettiva non venga eseguita immediatamente.

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

4
cosa dovrebbe essere per il parametro dinamico?
rony36,

28
@ rony36 - probabilmente vorrai avere una funzione che crei il timer intervallo per te. Passare il parametro alla funzione in modo che il suo valore venga acquisito nella chiusura della funzione e conservato per quando scade il timer. 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. :)
tvanfosson,

@tvanfosson: risposta fantastica! Sai come cancellare il modulo intervallo all'interno della funzione funca?
Flo

@tvanfosson Grazie. Mio male, ma in realtà intendevo l'esempio createInterval che hai dato nella sezione commenti. Come funzionerebbe per quello? Stavo pensando di passare anche una variabile timer come parametro dinamico, ma non sono sicuro di come o se abbia senso. Per motivi di chiarezza ho aggiunto una nuova domanda qui: stackoverflow.com/questions/40414792/…
Flo

78

ora con ES5, metodo bind prototipo di funzione:

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

Riferimento qui


2
Questa è la risposta migliore, tuttavia potrebbe avere un comportamento imprevisto a seconda della funzione. ad esempio console.log.bind(null)("Log me")lancerà Illegal invocation, ma console.log.bind(console)("Log me")funzionerà come previsto. Questo perché console.logrichiede consolecome thisarg.
Indy,

1
Di gran lunga la migliore risposta. Magra e pulita. Molte grazie!
Tobi,

Molto pulito ed efficiente!
contactmatt

2
Basta aggiungere che funziona con Chrome> = 7, Firefox> = 4.0, Explorer> = 9, Opera> = 11.60, Safari> = 5.1 (Fonte: developer.mozilla.org/ca/docs/Web/JavaScript/Reference/… )
Roger Veciana,

60

Aggiungili come parametri per setInterval:

setInterval(funca, 500, 10, 3);

La sintassi nella tua domanda usa eval, che non è una pratica consigliata.


2
Whaa ?! Da quando è stato permesso? (domanda seria)
Crescent Fresh,

1
Non sono sicuro. La mia fonte era: developer.mozilla.org/it/DOM/window.setInterval
Kev

2
@Kev Internet Explorer è un vero casino Non supporta il passaggio di argomenti -.-
ShrekOverflow

1
IMHO questa dovrebbe essere la risposta accettata. Soluzione piacevole, semplice e pulita.
LightMan

32

È 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.


1
È possibile accedere tramite
Classname.prototype.someFunction.parameter1

2
L'aggiunta di parametri a un oggetto o a una funzione può causare il rallentamento del compilatore poiché dovrà ricostruire la rappresentazione del codice nativo dell'oggetto (ad esempio se ciò è stato fatto in un hot loop), quindi fai attenzione.
mattdlockyer,

23
     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

Risposta meglio spiegata.
Drk_alien,

Quindi perché passare gli argomenti come array? Questo dettaglio non si riferisce nemmeno alla domanda.
user4642212,

18

Puoi usare una funzione anonima;

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

1
questa è una chiamata piuttosto costosa!
Roy Lee,

2
@Roylee Quanto costa?
user4642212

18
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);


Questo è molto meglio.
Ugur Kazdal,

Questo è molto meglio.
Ugur Kazdal,

11

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);

1
Stai dicendo che () => {} è il nuovo modo di ES6 per sostituire la funzione () {}? Interessante. Innanzitutto, ho pensato che i razzi fossero passe. E, a meno che questa sintassi non abbia altri usi comuni, è solo molto, molto strano. Vedo che sono "frecce grasse". Ancora strano. Immagino che a qualcuno piaccia ed è una questione di opinione.
Richard_G,

6

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


7
L'uso di eval è una pratica terribile. L'uso della funzione anonima è molto meglio.
SuperIRis

1

So che questo argomento è così vecchio ma ecco la mia soluzione sul passaggio di parametri in setIntervalfunzione.

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);
}

ho bisogno di accedere a un valore una volta quando chiamo la funzione, ma non ogni secondo, quindi la tua risposta fornisce questo, (ad esempio timer), ma come si fa clearInterval()in questo scenario?
user1063287

0

Funziona setInterval("foo(bar)",int,lang);... Jon Kleiser mi porta alla risposta.


0

Un'altra soluzione consiste nel passare la tua funzione in questo modo (se hai dinamiche variegate): setInterval ('funca (' + x + ',' + y + ')', 500);


0

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.

http://underscorejs.org/#bind

_.bind (funzione, ambito, * argomenti)


0

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".


0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.