Przekaż parametry w funkcji setInterval


320

Proszę doradzić, jak przekazać parametry do funkcji o nazwie using setInterval.

Mój przykład setInterval(funca(10,3), 500);jest niepoprawny.


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

Odpowiedzi:


543

Musisz utworzyć anonimową funkcję, aby rzeczywista funkcja nie została natychmiast wykonana.

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

4
jaki powinien być parametr dynamiczny?
rony36

28
@ rony36 - prawdopodobnie chcesz mieć funkcję, która tworzy dla ciebie interwał. Przekaż parametr do funkcji, aby jej wartość została przechwycona w zamknięciu funkcji i zachowana do momentu wygaśnięcia timera. function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); }Następnie nazwij to jako createInterval(funca,dynamicValue,500); Oczywiście możesz to rozszerzyć dla więcej niż jednego parametru. I proszę używać bardziej opisowych nazw zmiennych. :)
tvanfosson

@tvanfosson: niesamowita odpowiedź! Czy wiesz, jak wyczyścić formularz interwału w funkcji funca?
Flo

@tvanfosson Thanks. Mój zły, ale tak naprawdę miałem na myśli przykład createInterval, który podałeś w sekcji komentarza. Jak by to działało? Myślałem też o przekazaniu zmiennej timera jako parametru dynamicznego, ale nie jestem pewien, czy to ma sens. W trosce o jasność dodałem tutaj nowe pytanie: stackoverflow.com/questions/40414792/...
Flo

78

teraz z ES5, metoda wiązania Prototyp funkcji:

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

Odnośnik tutaj


2
To najlepsza odpowiedź, jednak w zależności od funkcji może mieć nieoczekiwane zachowanie. np. console.log.bind(null)("Log me")rzuci Illegal invocation, ale console.log.bind(console)("Log me")będzie działać zgodnie z oczekiwaniami. Jest tak, ponieważ console.logwymaga consolejako thisargument.
Indy,

1
Zdecydowanie najlepsza odpowiedź. Oprzyj się i czyść. Wielkie dzięki!
Tobi

Bardzo czysty i wydajny!
contactmatt

2
Wystarczy dodać, że działa z Chrome> = 7, Firefox> = 4.0, Explorer> = 9, Opera> = 11.60, Safari> = 5.1 (Źródło: developer.mozilla.org/ca/docs/Web/JavaScript/Reference/… )
Roger Veciana,

60

Dodaj je jako parametry do setInterval:

setInterval(funca, 500, 10, 3);

Składnia twojego pytania używa eval, co nie jest zalecaną praktyką.


2
Co? Od kiedy to było dozwolone? (poważne pytanie)
Crescent Fresh

1
Kev

2
@Kev Internet Explorer to prawdziwy bałagan Nie obsługuje przekazywania argumentów -.-
ShrekOverflow 28.01.12

1
IMHO powinna to być zaakceptowana odpowiedź. Ładne, proste i czyste rozwiązanie.
LightMan

32

Możesz przekazać parametry jako właściwość obiektu funkcji, a nie jako parametr:

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

Następnie w swojej funkcji someFunctionbędziesz miał dostęp do parametrów. Jest to szczególnie przydatne w klasach, w których zakres automatycznie przechodzi do przestrzeni globalnej i na początku tracisz odwołania do klasy, która nazywała się setInterval. Przy takim podejściu „parametr2” w „someFunction”, w powyższym przykładzie, będzie miał odpowiedni zasięg.


1
Możesz uzyskać dostęp przez Classname.prototype.someFunction.parameter1
JoaquinG

2
Dodanie parametrów do obiektu lub funkcji może spowodować spowolnienie kompilatora, ponieważ będzie on musiał odbudować jego natywną reprezentację kodu obiektu (na przykład, jeśli zostało to zrobione w gorącej pętli), więc bądź ostrożny.
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

Najlepsza wyjaśniona odpowiedź.
Drk_alien

Dlaczego więc podawać argumenty jako tablice? Ten szczegół nawet nie dotyczy pytania.
user4642212

18

Możesz użyć funkcji anonimowej;

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

1
to dość kosztowne połączenie!
Roy Lee

2
@Roylee Jak to jest drogie?
user4642212

18
setInterval(function,milliseconds,param1,param2,...)

Aktualizacja: 2018 - użyj operatora „spread”

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

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


To jest o wiele lepsze.
Ugur Kazdal

To jest o wiele lepsze.
Ugur Kazdal

11

Zdecydowanie najbardziej praktyczną odpowiedzią jest ta udzielona przez tvanfosson, wszystko co mogę zrobić, to dać ci zaktualizowaną wersję z ES6:

setInterval( ()=>{ funca(10,3); }, 500);

1
Czy mówisz, że () => {} jest nowym sposobem ES6 na zastąpienie funkcji () {}? Ciekawy. Po pierwsze, myślałem, że rakiety są przelatujące. I, chyba że ta składnia ma inne typowe zastosowania, jest po prostu bardzo, bardzo dziwna. Widzę, że to „grube strzały”. Nadal dziwne. Chyba komuś się to podoba i to kwestia opinii.
Richard_G

6

Cytowanie argumentów powinno wystarczyć:

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

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

Zwróć uwagę na pojedynczy cytat ' dla każdego argumentu.

Testowane z IE8, Chrome i FireFox


7
Korzystanie z eval jest okropną praktyką. Korzystanie z funkcji anonimowych jest znacznie lepsze.
SuperIRis

1

Wiem, że ten temat jest tak stary, ale oto moje rozwiązanie dotyczące przekazywania parametrów w setIntervalfunkcji.

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

Muszę uzyskać dostęp do wartości raz podczas wywoływania funkcji, ale nie co sekundę, więc twoja odpowiedź zawiera takie informacje (np. timer), ale jak sobie radzisz clearInterval()w tym scenariuszu?
user1063287,

0

To działa setInterval("foo(bar)",int,lang);... Jon Kleiser prowadzi mnie do odpowiedzi.


0

Inne rozwiązanie polega na przekazaniu funkcji w ten sposób (jeśli masz zmienne dynamiki): setInterval ('funca (' + x + ',' + y + ')', 500);


0

Możesz użyć biblioteki o nazwie podkreślenie js. Daje to dobre opakowanie dla metody bindowania i jest również znacznie czystszą składnią. Umożliwiając wykonanie funkcji w określonym zakresie.

http://underscorejs.org/#bind

_.bind (funkcja, zakres, * argumenty)


0

Ten problem byłby fajną demonstracją zastosowania zamknięć. Chodzi o to, że funkcja używa zmiennej o zasięgu zewnętrznym. Oto przykład...

setInterval(makeClosure("Snowden"), 1000)

function makeClosure(name) {
var ret

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

return ret;
}

Funkcja „makeClosure” zwraca inną funkcję, która ma dostęp do „nazwy” zmiennej zakresu zewnętrznego. Zasadniczo musisz przekazać dowolne zmienne do funkcji „makeClosure” i użyć ich w funkcji przypisanej do zmiennej „ret”. Odpowiednio, setInterval wykona funkcję przypisaną do „ret”.


0

Miałem ten sam problem z aplikacją Vue. W moim przypadku to rozwiązanie działa tylko wtedy, gdy funkcja anonimowa została zadeklarowana jako funkcja strzałki, w odniesieniu do deklaracji na mounted ()haku koła ratunkowego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.