2010-06-03 29 views
9

Zrobiłem ten kod:wywołania funkcji anonimowy zdefiniowane w setInterval

window.setInterval(function(){ var a = doStuff(); var b = a + 5; }, 60000) 

Rzeczywista zawartość funkcji anonimowej jest oczywiście tylko mały przykład tego, jak to nie ma znaczenia. To, co naprawdę się dzieje, to grupa zmiennych tworzona w zakresie samej funkcji, ponieważ nie potrzebuję/chcę zanieczyszczać przestrzeni globalnej.

Ale jak wszyscy wiecie, funkcja doStuff() nie zostanie wywołana do 60 sekund na stronie. Chciałbym również wywołać tę funkcję natychmiast, gdy tylko strona zostanie załadowana, i odtąd co 60 sekund.

Czy jest możliwe wywołanie funkcji bez kopiowania/wklejenia kodu wewnętrznego zaraz po linii setInterval()? Jak już powiedziałem, nie chcę zanieczyszczać przestrzeni globalnej niepotrzebnymi zmiennymi, które nie są potrzebne poza funkcją.

+0

Utwórz funkcję poza przedziałem i umieść w zmiennej? –

+1

Wiem, ale tego właśnie próbuję uniknąć, jeśli to możliwe. – Tominator

Odpowiedz

14

można umieścić funkcję zwrotną w zmiennej i zakończyć wszystko w własnym powołując anonimowej funkcji:

(function() { 
    var callback = function() { 
     var a = doStuff(); 
     var b = a + 5; 
    }; 

    callback(); 

    window.setInterval(callback, 60000); 
})(); 

bez zanieczyszczeń.

+3

+1, podczas gdy poniższy kod jest całkowicie ważny, uważam, że czytanie jest irytujące. – Warty

+0

Fajnie, to działa ładnie! – Tominator

5

Jest to możliwe bez tworzenia zmiennych globalnych, a także:

setInterval((function fn() { 
console.log('foo'); // Your code goes here 
return fn; 
})(), 5000); 

Faktycznie, w ten sposób, nie tworzy żadnych zmiennych w ogóle.

Jednak w programie Internet Explorer funkcja fn stanie się dostępna z otaczającego zakresu (z powodu błędu). Jeśli nie chcesz, aby tak się stało, po prostu zawinąć wszystko w własnym powołując anonimowej funkcji:

(function() { 
setInterval((function fn() { 
    console.log('foo'); // Your code goes here 
    return fn; 
})(), 5000); 
})(); 

punktów Paula Irlandczyków dla sharing this trick.


Edit: Odpowiedź na bieżąco z pewnym więcej informacji, dzięki bobince.

+0

Sprytny! Niemal zbyt sprytny :) – Miles

+0

hmm w tym przypadku funkcja anonimowa zostaje wywołana raz, ale funkcja setInterval mówi "nieprawidłowy argument przekazany". Prawdopodobnie uzyskuje wynik wykonanej funkcji i próbuje ponownie wykonać to (co jest nieważne) po 5 sekundach. – Tominator

+0

@ Tominator: To nie powinno się zdarzyć. Opublikowany przeze mnie fragment kodu działa dobrze w mojej konsoli. Pokaż nam swój kod. –

0

jeszcze inne rozwiązanie:

(function() { 
    var a = doStuff(); 
    var b = a + 5; 
    window.setTimeout(arguments.callee, 60000); 
})(); 

używa limitu czasu zamiast odstępu tak, że można go uruchomić po raz pierwszy, a następnie uruchom ponownie to samo po przekroczeniu limitu czasu.

Powiązane problemy