2010-06-03 6 views
9

ich diesen Code gemacht haben:Anruf eine anonyme Funktion definiert in einem setInterval

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

Der eigentliche Inhalt der anonymen Funktion ist natürlich nur für dieses kleine Beispiel, wie es spielt keine Rolle. Was wirklich passiert, ist, dass eine Menge von Variablen im Rahmen der Funktion selbst erzeugt wird, weil ich den globalen Raum nicht verschmutzen muss.

Aber wie Sie alle wissen, wird die Funktion doStuff() erst 60 Sekunden auf der Seite aufgerufen. Ich möchte die Funktion auch sofort aufrufen, sobald die Seite geladen ist, und von da an auch alle 60 Sekunden.

Ist es irgendwie möglich, die Funktion ohne Kopieren/Einfügen des internen Codes direkt nach der setInterval() Zeile aufzurufen? Wie gesagt, ich möchte den globalen Raum nicht mit nutzlosen Variablen verschmutzen, die außerhalb der Funktion nicht benötigt werden.

+0

Die Funktion außerhalb des Intervalls erstellen und in eine Variable einfügen? –

+1

Ich weiß, aber das ist, was ich versuche zu vermeiden, wenn möglich. – Tominator

Antwort

14

Sie können Ihre Callback-Funktion in einer Variablen setzen, und wickeln alles in einer selbst Aufruf anonymen Funktion auf:

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

    callback(); 

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

Keine Verschmutzung.

+3

+1 während der untenstehende Code ist absolut gültig, halte ich es für lästig zu lesen. – Warty

+0

Cool, das funktioniert gut! – Tominator

5

Dies ist möglich, ohne globale Variablen als auch die Schaffung:

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

Eigentlich diese Art und Weise wird, erstellen Sie keine Variablen überhaupt.

In Internet Explorer wird die fn-Funktion jedoch aus dem umgebenden Bereich (aufgrund eines Fehlers) zugänglich gemacht. Wenn Sie nicht wollen, dass das geschehen kann, einfach wickeln alles in einem selbst Aufruf anonyme Funktion:

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

Credit Paul Irish für sharing this trick.


Edit: Antwort mit etwas mehr Informationen aktualisiert, dank bobince.

+0

Clever! Fast zu schlau :) – Miles

+0

hmm In diesem Fall wird die anonyme Funktion einmal aufgerufen, aber dann sagt die setInterval-Funktion "ungültiges Argument übergeben". Es wird wahrscheinlich das Ergebnis der ausgeführten Funktion erhalten und versucht, das Ergebnis (das ungültig ist) nach 5 Sekunden erneut auszuführen. – Tominator

+0

@Tominator: Das sollte nicht passieren. Das Code-Snippet, das ich gepostet habe, funktioniert in meiner Konsole einwandfrei. Bitte zeigen Sie uns Ihren Code. –

0

noch eine andere Lösung:

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

Dieses verwendet Timeout statt Intervall, so dass es das erste Mal laufen und führen Sie dann ist es selbst wieder nach einem Timeout.

Verwandte Themen