2016-07-12 11 views
0

Diese Funktion soll nur einmal ausgeführt werden. Allerdings verstehe ich nicht, warum jedes Mal, wenn es aufgerufen wird, die Variable nicht zu false zurückkehrt.Warum funktioniert diese Funktion? Sollte nicht "ausgeführt" jedes Mal, wenn die Funktion aufgerufen wird, zu false zurückkehren?

var onlyOnce = function() { 
 
    var executed = false; 
 
    return function() { 
 
    if (executed == false) { 
 
     executed = true; 
 
     console.log("Code reached"); 
 
    } 
 
    }; 
 
}(); 
 
onlyOnce(); 
 
onlyOnce();

nur einmal Dieser Code druckt. Warum funktioniert das?

+0

In Javascript haben die Variablen Geltungsbereich in den enthaltenen Klammern. In gewissem Sinn denken Sie an die zurückgegebene Funktion als "ausgeführt" als global und behalten daher ihren Wert bei, wenn Sie sie ändern. Es ist komisch, aber hey, das ist Javascript – Makketronix

+0

Lesen Sie über Schließungen ... http://stackoverflow.com/questions/111102/how-do-javascript-closures-work –

Antwort

2

Das liegt daran, dass Sie sofort eine Funktion ausführen und onlyOnce auf dieses Ergebnis setzen. Man könnte es so umschreiben:

function createOnlyOnce() { 
    var executed = false; 
    return function() { // Return a new function 
    if (!executed) { // I prefer this over == false 
     executed = true; 
     console.log('Code reached'); 
    } 
    }; 
} 

var onlyOnce = createOnlyOnce(); // Created a new function 
onlyOnce(); // Calls the generated function, not createOnlyOnce 
onlyOnce(); // Since we're calling the generated function, executed is still `true` 

Was Sie am Ende mit einem closure. ist Das bedeutet, dass der Wert von executed verwendet und kann innerhalb der erzeugten Funktion verändert. Wie auch immer Sie es eingestellt haben, es hat immer noch den Wert, wenn Sie es das nächste Mal anrufen (es sei denn, etwas anderes ändert es natürlich).

0

Mit der selbstausführenden äußeren Funktion wird eine Schließung erstellt. Daher wird jede Ausführung der zurückgegebenen Funktion auf derselben Instanz von executed ausgeführt. Dies führt zu dem beobachteten Verhalten.

Sie sollten auf Verschlüsse, e.g. on MDN nachlesen.