2009-01-19 14 views

Odpowiedz

436

Należy utworzyć anonimową funkcję, aby faktyczna funkcja nie została wykonana od razu.

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

jaki powinien być parametr dynamiczny? – rony36

+21

@ rony36 - prawdopodobnie chcesz mieć funkcję, która tworzy dla Ciebie interwał czasowy. Przekaż parametr do funkcji, aby jego wartość została przechwycona przy zamknięciu funkcji i zachowana, gdy upłynie czas timera. 'function createInterval (f, dynamicParameter, interval) {setInterval (function() {f (dynamicParameter);}, interval); } 'Następnie nazwij to jako' createInterval (funca, dynamicValue, 500); 'Oczywiście możesz rozszerzyć to dla więcej niż jednego parametru. I proszę, użyj bardziej opisowych nazw zmiennych. :) – tvanfosson

+2

@tvanfosson - Jak wyczyścić ten rodzaj interwału? – Yong

34

Dodaj je jako parametry do setInterval:

setInterval(funca, 500, 10, 3); 

Składnia w swoim pytaniu używa eval, który nie jest zalecane praktyki.

+6

To nie zadziała w Internet Explorerze. – Kev

+1

Co ?! Od kiedy to było dozwolone? (poważne pytanie) –

+1

Nie jestem pewien. Moje źródło było: https://developer.mozilla.org/en/DOM/window.setInterval – Kev

16

Możesz użyć anonimowej funkcji;

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

to dość kosztowna rozmowa! – Roylee

+0

@Roylee Jak to jest drogie? – Xufox

0

Działa setInterval("foo(bar)",int,lang); .... Jon Kleiser doprowadzić mnie do odpowiedzi.

29

można przekazać parametr (y) jako właściwość obiektu funkcyjnego, 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 funkcji someFunction, będziesz mieć dostęp do parametrów. Jest to szczególnie użyteczne w klasach, w których zasięg automatycznie trafia do przestrzeni globalnej i na początku tracisz odniesienia do klasy, która nazywała się setInterval. Przy takim podejściu "parameter2" w "someFunction", w powyższym przykładzie, będzie mieć odpowiedni zasięg.

+0

Możesz uzyskać dostęp poprzez Classname.prototype.someFunction.parameter1 – JoaquinG

+2

Dodanie parametrów do obiektu lub funkcji może spowodować spowolnienie kompilatora, ponieważ będzie musiał odbudować natywną reprezentację kodu obiektu (na przykład, jeśli zrobiono to w trybie gorącym loop), więc bądź ostrożny. – mattdlockyer

5

Przytaczając argumenty powinny być wystarczająco:

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

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

Uwaga pojedynczy cytat ' dla każdego argumentu.

Testowane z IE8, Chrome i FireFox

+6

Korzystanie z eval to okropna praktyka. Korzystanie z anonimowej funkcji jest o wiele lepsze. – SuperIRis

56

teraz z ES5 wiążą prototypu metoda Funkcja:

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

Reference here

+1

To jest najlepsza odpowiedź, ale może mieć nieoczekiwane zachowanie w zależności od funkcji. na przykład '' console.log.bind (null) ("Zaloguj mnie") '' wyrzuci '' Nielegalne wywołanie'', ale '' console.log.bind (console) ("Zaloguj mnie") '' będzie działać zgodnie z oczekiwaniami . Dzieje się tak, ponieważ '' console.log'' wymaga '' console'' jako argumentu '' this''. – Indy

+1

Zdecydowanie najlepsza odpowiedź. Chude i czyste. Wielkie dzięki! – Tobi

+0

Bardzo czysty i wydajny! – contactmatt

12
 setInterval(function(a,b,c){ 

      console.log(a + b +c); 

     }, 500, [1],[2],[3]); 

      //note the console will not print 6 
      // rather it will print 123 in every 500 ms 
      // because arguments are passed as array not as numbers 
      // tested in node.js ie 11 and chrome 
+0

Najlepsza wyjaśniona odpowiedź. –

+0

Dlaczego więc przekazywać argumenty jako tablice? Ten szczegół nie odnosi się nawet do pytania. – Xufox

0

Innym rozwiązaniem jest zdać funkcję tak (jeśli masz zmienne vars): setInterval ('funca (' + x + ',' + y + ')', 500);

-1

Można użyć biblioteki o nazwie podkreślenie js. Daje ładne opakowanie na metodę wiązania i jest również znacznie czystszą składnią. Umożliwia wykonanie funkcji w określonym zakresie.

http://underscorejs.org/#bind

_.bind (funkcja, zakres, * arguments)

10
setInterval(function,milliseconds,param1,param2,...) 
-2

Dodawanie parenthesizes po funkcji anonimowej wydaje rade:

function clock() { 
    n = 10; 

    while(--n) { 
     setInterval(function() { 
      console.log(n); 
     }(n), 1000); 
    } 
} 
+1

Twój kod po prostu uruchomi funkcję, ale nie zastosuje do niej opóźnienia, możesz usunąć linie otaczające 'console.log (n)', a otrzymasz dokładnie taki sam wynik. –

0

Znam ten temat jest tak stary, ale tutaj jest moje rozwiązanie dotyczące przekazywania parametrów w funkcji setInterval.

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

Zdecydowanie odpowiedź najbardziej praktyczna jest ta podana przez tvanfosson, wszystko, co mogę zrobić, to daje zaktualizowaną wersję z ES6:

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

Czy mówisz, że() => {} to nowy sposób ES6 zastąpienia funkcji() {}? Ciekawy. Po pierwsze myślałem, że rakiety są passe. I, o ile ta składnia nie ma innych powszechnych zastosowań, jest po prostu bardzo, bardzo dziwne. Widzę, że są "grubymi strzałami". Wciąż dziwne. Myślę, że ktoś to lubi i jest to kwestia opinii. –

Powiązane problemy