2017-01-23 3 views
0

In meinem naiven Konzept, ist ein Verschluss einfach eine Funktion Rückkehr durch eine andere Funktion, die den Umfang der äußeren Funktion bewahren, nachdem sie zurück:Was ist die Bedingung, um eine Schließung zu schaffen?

var factory = function(y){ 
 
    var x = 2; 
 
    return function(){ 
 
     console.log(x+y); 
 
    } 
 
} 
 

 
var closure1 = factory(2); 
 
closure1(); // output 4 
 

 
var closure2 = factory(10); 
 
closure1(); // output 4 
 
closure2(); // output 12

Obwohl ich verstehe nicht, warum das Hinzufügen Event-Handler in Schleife wird Schließungen erstellen? (Wie in MDN gezeigt) Der Event-Handler wird nicht explizit zurückgegeben, dies ist nicht das Problem in diesem Problem.


Dann stieß ich auf eine anderen page, und bei etwa Code-Snippet # 2:, sagte, es

Die Onclick-Funktion einen Verschluss schaffen würde, wenn es Variablen in ihrem Umfang Bezug genommen wird, aber es nicht.

Bedeutet dies, dass in der Schleife

nodes[i].onclick = function() { return false; }; nicht Schließungen ist

Aber wenn ich es in

geändert

nodes[i].onclick = function() { console.log(i); return false; };

Dann wird es Schließung?


die Teile über Combined, mein Konzept einen Verschluss

zu erstellen ist
  1. Es braucht eine Funktion in einer anderen Funktion zurückgegeben werden, oder die Callback-Funktion, die in einer anderen Funktion angebracht
  2. die Innen Funktion MUST irgendwie Umfang äußere Funktion zugreifen

ist es wahr, dass ein Verschluss iff 1 erstellt wird & 2 sind zufrieden?

Antwort

1

ein Verschluss ist einfach eine Funktion Rückkehr durch eine andere Funktion, die den Umfang der äußeren Funktion erhalten, nachdem es

kehrt

Schließen.

Es ist eine Funktion, auf die noch Referenzen verweisen, nachdem die Funktion, in der sie erstellt wurde, beendet ist.

Zurückgeben ist eine Möglichkeit, einen Verweis darauf zu bewahren.

Obwohl ich nicht verstehe, warum das Hinzufügen von Ereignishandler in Schleife Schließungen erstellen wird?

Die Referenz wird an den Ereignisbehandlungscode übergeben. Dies bewahrt es, nachdem die Funktion, die es dort passiert hat, beendet ist.


Bedeutet dies, dass in der Schleife ...

Ja, es tut.


Es muss eine Funktion zurückgegeben werden kann überall so lange in einer anderen Funktion oder die Callback-Funktion, die in einer anderen Funktion angebracht

Nr Die Referenz gehen, wie es erhalten bleibt.

var obj = {}; 
 

 
function create() { 
 

 
    var foo = 1; 
 

 
    obj.bar = function() { 
 
    console.log(foo++); 
 
    }; 
 
} 
 

 
create(); 
 

 
obj.bar(); 
 
obj.bar(); 
 
obj.bar(); 
 
obj.bar();

Die innere Funktion muss irgendwie äußeren Umfang der Funktion zugreifen

Ja

Verwandte Themen