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.

Rakesh
źródło
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 );
tvanfosson
źródło
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

sbr
źródło
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ą.

Kev
źródło
2
Co? Od kiedy to było dozwolone? (poważne pytanie)
Crescent Fresh
1
Niepewny. Moje źródło to: developer.mozilla.org/en/DOM/window.setInterval
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.

Juan
źródło
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
manas
źródło
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);
Szymon
źródło
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);

chwycić
źródło
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);
A.rodriguez
źródło
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

waterazu
źródło
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);
}
Kaan Karaca
źródło
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.

Stephen
źródło
0

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

nonozor
źródło
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)

Sagar Parikh
źródło
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”.

Aleksey Kanaev
źródło
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.

Srdjan Milic
źródło