2017-12-21 7 views
2

Aus jeder Definition, die ich nachgeschlagen habe, schließen Sie, wenn eine Funktion innerhalb einer anderen Funktion erstellt oder deklariert wird. Beispiele gibt es reichlich über Blogs und Websites dieses Geschehens. Aber was ist, wenn die Funktion außerhalb einer anderen Funktion deklariert wird, aber aufgerufen von einer Funktion aufgerufen wird? Zum Beispiel:Wird eine Schließung erstellt, wenn eine Funktion in einer anderen Funktion aufgerufen (nicht deklariert) wird, und wenn ja, warum?

const add = (x,y) => { 
    return x + y; 
}; 

const double = num => { 
    return add(num,num) 
}; 

let a = double(6);/*?*/ 

Fügt add (num, num) Abschluss hinzu? Wenn ja, bitte hilf mir zu verstehen warum.

+0

Nein, es gibt keine Funktion, die im Aufruf 'add (num, num)', (noch im Aufruf 'double (6)') erzeugt wird, also gibt es keine Schließung. – Bergi

Antwort

1

Verschlüsse sind ein Produkt von lexical scope.

A Verschluss ist die Kombination aus einer Funktion und die lexikalischen Umgebung innerhalb denen die Funktion erklärt wurde.

Sie müssen eine Funktion in einer anderen definieren, um eine Schließung zu erstellen.

In Ihrem Beispiel rufen Sie einfach eine Funktion auf, die eine andere aufruft und ihren Rückgabewert verwendet. Zu keinem Zeitpunkt kann die double Funktion auf den Bereich der add Funktion zugreifen: ihre Bereiche sind unterschiedlich.

Dies ist ein klassisches Beispiel für JavaScript Schließung

var makeAdder = function(x) { 
 
    return function(y) { 
 
     return x + y; 
 
    }; 
 
} 
 

 
var add5 = makeAdder(5); 
 
var add10 = makeAdder(10); 
 

 
console.log(add5(2)); // 7 
 
console.log(add10(2)); // 12

In beiden Fällen werden die von makeAdder zurück Funktionen, die äußere Umfang, in dem „erinnern“, die erstellt wurden (den Umfang erstellt durch die makeAdder Funktion).

Alles, was im Rahmen der äußeren Funktion war, war auch im Bereich für die innere Funktion, und es bleibt so, wenn die innere Funktion zurückgegeben wird.

+0

Können Sie mir helfen, warum hier zu verstehen: https://stackoverflow.com/questions/615907/how-is--closure-different-from-a-callback sie sagen, dass eine Rückruffunktion mit Kontextvariablen eine Schließung ist? –

+0

Was würde bedeuten, dass, wenn ich das Obige als const schreibe, add = (x, y) => { Rückkehr x + y; }; const double = (Anzahl, Funktion) => { Rückgabe func (num, num); }; let a = double (6, add);/*? */ Dann wird die Schließung erstellt –

+0

@ChaseNorton Das schafft keine Schließung. 'double' ruft nur einen Rückruf an. Du bekommst eine Schließung, wenn du 'Funktion zurückbringst (...) {...}' – Barmar

Verwandte Themen