2016-08-03 21 views
0

Im answers to this question jemand weist weise darauf hin, dassWarum ist die Timeout-Variable in diesem Fall gemeinsam nutzbar?

Die Timeout-Variable bei jedem Aufruf der erzeugte Funktion auch nach debounce zugänglich bleibt selbst zurückgekehrt ist, und kann Veränderung über verschiedene Anrufe.

Es ergibt keinen Sinn für mich. Da die Timeout-Variable für jeden Aufruf von Debounce lokal ist, sollte sie nicht gemeinsam genutzt werden können, oder?

p.s. Auch wenn es sich um eine Schließung handelt, sollte jeder Anruf eine andere Schließung haben, sie alle verlängern gleichzeitig ihr Leben, nachdem die Mutterfunktion zurückgekehrt ist, aber sie sollten nicht miteinander sprechen, nicht wahr?

Hier ist die Funktion von der anderen Frage:

// Returns a function, that, as long as it continues to be invoked, will not 
// be triggered. The function will be called after it stops being called for 
// N milliseconds. 
function debounce(func, wait, immediate) { 
    var timeout;    //Why is this set to nothing? 
    return function() { 
     var context = this, 
     args = arguments; 
     clearTimeout(timeout); // If timeout was just set to nothing, what can be cleared? 
     timeout = setTimeout(function() { 
      timeout = null; 
      if (!immediate) func.apply(context, args); 
     }, wait); 
     if (immediate && !timeout) func.apply(context, args); //This applies the original function to the context and to these arguments? 
    }; 
}; 

Antwort

2

Ja, jeder Anruf von debounce wird ein frischer Satz von allem, aber Sie werden nicht wiederholt debounce aufrufen. Sie rufen debounce einmal auf und rufen dann wiederholt die Funktion auf, die von debounce zurückgegeben wurde. Diese Funktion schließt über timeout.

var f = debounce(func, wait, immediate); 
f(); // won't call func immediately 
f(); // still won't call func 
// wait a while, now func will be called 

würden Sie rufen nur debounce selbst mehrere Male mehrere entprellten Funktionen (a g und h in dem obigen Beispiel) einzurichten.

+0

Ausgezeichnete Antwort! Auf den Punkt gebracht. Danke Thilo! –

+1

Gibt es eine praktische Verwendung für die Variable "Kontext"? In meinem Debugging-Test bezieht sich die Variable "context" immer auf das Window-Objekt. Ich schätze, es liegt an der Tatsache, dass es eine anonyme Funktion ist. Könnte es anderen Nutzen haben? Vielen Dank. –

+1

Ich nehme an, Sie könnten die zurückgegebene Schließung einem Objekt zuweisen, und dieses Objekt würde "this" im ursprünglichen 'func' werden:' var x = {f: debounce (func, w, i)}; x.f(); } ' – Thilo