Übergeben Sie die Parameter in der Funktion setInterval

320

Bitte geben Sie an, wie Parameter an eine Funktion übergeben werden, die mit using aufgerufen wird setInterval.

Mein Beispiel setInterval(funca(10,3), 500);ist falsch.

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

Antworten:

543

Sie müssen eine anonyme Funktion erstellen, damit die eigentliche Funktion nicht sofort ausgeführt wird.

setInterval( function() { funca(10,3); }, 500 );
Tvanfosson
quelle
4
Was soll für dynamische Parameter sein?
Rony36
28
@ rony36 - Sie möchten wahrscheinlich eine Funktion haben, die den Intervall-Timer für Sie erstellt. Übergeben Sie den Parameter an die Funktion, damit sein Wert beim Schließen der Funktion erfasst und beibehalten wird, wenn der Timer abläuft. function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); }Nennen Sie es dann als createInterval(funca,dynamicValue,500); Offensichtlich können Sie dies für mehr als einen Parameter erweitern. Verwenden Sie bitte aussagekräftigere Variablennamen. :)
Tvanfosson
@tvanfosson: tolle Antwort! Wissen Sie, wie Sie das Intervallformular innerhalb der Funktion löschen können funca?
Flo
@ tvanfosson Danke. Mein schlechtes, aber ich meinte eigentlich das createInterval-Beispiel, das Sie im Kommentarbereich angegeben haben. Wie würde es dafür funktionieren? Ich dachte daran, eine Timer-Variable auch als dynamischen Parameter zu übergeben, war mir aber nicht sicher, wie oder ob das sinnvoll ist. Im Interesse der Klarheit habe ich hier eine neue Frage hinzugefügt: stackoverflow.com/questions/40414792/…
Flo
78

jetzt mit ES5, Bindungsmethode Funktionsprototyp:

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

Referenz hier

sbr
quelle
2
Dies ist die beste Antwort, kann jedoch je nach Funktion zu unerwartetem Verhalten führen. zB console.log.bind(null)("Log me")wird werfen Illegal invocation, aber console.log.bind(console)("Log me")wird wie erwartet funktionieren. Dies liegt daran, console.logdass consoleals thisArgument erforderlich ist .
Indy
1
Mit Abstand die beste Antwort. Schlank und sauber. Vielen Dank!
Tobi
Sehr sauber und effizient!
Kontaktmatt
2
Fügen Sie einfach hinzu, dass dies mit Chrome> = 7, Firefox> = 4.0, Explorer> = 9, Opera> = 11.60, Safari> = 5.1 funktioniert (Quelle: developer.mozilla.org/ca/docs/Web/JavaScript/Reference/… ).
Roger Veciana
60

Fügen Sie sie als Parameter zu setInterval hinzu:

setInterval(funca, 500, 10, 3);

Die Syntax in Ihrer Frage verwendet eval, was nicht empfohlen wird.

Kev
quelle
2
Was?! Seit wann war das erlaubt? (ernste Frage)
Crescent Fresh
1
Nicht sicher. Meine Quelle war: developer.mozilla.org/en/DOM/window.setInterval
Kev
2
@ Kevin Internet Explorer ist ein echtes Chaos Es unterstützt nicht die Übergabe von Argumenten -.-
ShrekOverflow
1
IMHO sollte dies die akzeptierte Antwort sein. Schöne, einfache und saubere Lösung.
LightMan
32

Sie können die Parameter als Eigenschaft des Funktionsobjekts und nicht als Parameter übergeben:

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

Dann haben Sie in Ihrer Funktion someFunctionZugriff auf die Parameter. Dies ist besonders nützlich in Klassen, in denen der Bereich automatisch in den globalen Bereich verschoben wird und Sie Verweise auf die Klasse verlieren, die zunächst setInterval aufgerufen hat. Bei diesem Ansatz hat "parameter2" in "someFunction" im obigen Beispiel den richtigen Gültigkeitsbereich.

Juan
quelle
1
Sie können über Classname.prototype.someFunction.parameter1
JoaquinG
2
Das Hinzufügen von Parametern zu einem Objekt oder einer Funktion kann dazu führen, dass der Compiler langsamer wird, da er seine native Codedarstellung des Objekts neu erstellen muss (z. B. wenn dies in einer Hot-Loop durchgeführt wurde). Seien Sie also vorsichtig.
Mattdlockyer
22
     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
Manas
quelle
Am besten erklärte Antwort.
Drk_alien
Warum also die Argumente als Arrays übergeben? Dieses Detail bezieht sich nicht einmal auf die Frage.
user4642212
18

Sie können eine anonyme Funktion verwenden.

setInterval(function() { funca(10,3); },500);
Simon
quelle
1
Das ist ein ziemlich teurer Anruf!
Roy Lee
2
@ Roylee Wie ist es teuer?
user4642212
18
setInterval(function,milliseconds,param1,param2,...)

Update: 2018 - Verwenden Sie den Operator "Spread"

function repeater(param1, param2, param3){
   alert(param1);
   alert(param2);
   alert(param3); 
}

let input = [1,2,3];
setInterval(repeater,3000,...input);

Swogger
quelle
Das ist viel besser.
Ugur Kazdal
Das ist viel besser.
Ugur Kazdal
11

Die mit Abstand praktischste Antwort ist die von tvanfosson. Ich kann Ihnen nur eine aktualisierte Version mit ES6 geben:

setInterval( ()=>{ funca(10,3); }, 500);
A. rodriguez
quelle
1
Wollen Sie damit sagen, dass () => {} die neue Methode von ES6 ist, function () {} zu ersetzen? Interessant. Zuerst dachte ich, Raketen wären Passe. Und wenn diese Syntax nicht für andere Zwecke verwendet wird, ist sie nur sehr, sehr seltsam. Ich sehe, dass sie "fette Pfeile" sind. Trotzdem seltsam. Ich denke, jemand mag es und es ist Ansichtssache.
Richard_G
6

Das Zitieren der Argumente sollte ausreichen:

OK --> reloadIntervalID = window.setInterval( "reloadSeries('"+param2Pass+"')" , 5000)

KO --> reloadIntervalID = window.setInterval( "reloadSeries( "+param2Pass+" )" , 5000)

Beachten Sie das einfache Anführungszeichen 'für jedes Argument.

Getestet mit IE8, Chrome und FireFox

waterazu
quelle
7
Eval zu benutzen ist eine schreckliche Praxis. Die Verwendung der anonymen Funktion ist viel besser.
SuperIRis
1

Ich weiß, dass dieses Thema so alt ist, aber hier ist meine Lösung zum Übergeben von Parametern in der setIntervalFunktion.

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);
}
Kaan Karaca
quelle
Ich muss einmal auf einen Wert zugreifen, wenn ich die Funktion aufrufe, aber nicht jede Sekunde. Ihre Antwort liefert dies (z. B. timer), aber wie geht es Ihnen clearInterval()in diesem Szenario?
user1063287
0

Das funktioniert setInterval("foo(bar)",int,lang);... Jon Kleiser hat mich zur Antwort geführt.

Stephen
quelle
0

Eine andere Lösung besteht darin, Ihre Funktion wie folgt zu übergeben (wenn Sie dynamische Variablen haben): setInterval ('funca (' + x + ',' + y + ')', 500);

Nonozor
quelle
0

Sie können eine Bibliothek namens Unterstrich js verwenden. Es gibt einen schönen Wrapper für die Bindemethode und ist auch eine viel sauberere Syntax. Damit können Sie die Funktion im angegebenen Bereich ausführen.

http://underscorejs.org/#bind

_.bind (Funktion, Umfang, * Argumente)

Sagar Parikh
quelle
0

Dieses Problem wäre eine schöne Demonstration für die Verwendung von Verschlüssen. Die Idee ist, dass eine Funktion eine Variable des äußeren Bereichs verwendet. Hier ist ein Beispiel...

setInterval(makeClosure("Snowden"), 1000)

function makeClosure(name) {
var ret

ret = function(){
    console.log("Hello, " + name);
}

return ret;
}

Die Funktion "makeClosure" gibt eine andere Funktion zurück, die Zugriff auf die äußere Bereichsvariable "name" hat. Grundsätzlich müssen Sie also alle Variablen an die Funktion "makeClosure" übergeben und sie in der Funktion verwenden, die der Variablen "ret" zugewiesen ist. Bezeichnenderweise führt setInterval die Funktion aus, die "ret" zugewiesen ist.

Aleksey Kanaev
quelle
0

Ich hatte das gleiche Problem mit der Vue-App. In meinem Fall funktioniert diese Lösung nur, wenn die anonyme Funktion als Pfeilfunktion deklariert wurde, was die Deklaration am mounted ()Life Circle Hook betrifft.

Srdjan Milic
quelle