Vraag Wat verwijst "sluiting" precies in JavaScript?


Ik begrijp welke sluitingen dat zijn, maar ik heb wat problemen met het klesten precies wat de term is closure verwijst naar. Ik heb de term op veel websites gebruikt, maar ze zijn het zelden eens over de definitie ervan.

  • Zijn het de variabelen die op het stapelframe worden bewaard?
  • Is het de functie die wordt teruggestuurd?
  • Ligt het aan de omvang van de uiterlijke functie?
  • Ligt het aan de reikwijdte van de innerlijke (teruggekeerde) functie?
  • Is het misschien het concept van het behouden van de variabelen op het stapelframe nadat de functie is geretourneerd?

Kan iemand me precies vertellen wat closure verwijst naar?


66
2017-11-26 06:52


oorsprong


antwoorden:


Van JavaScript-sluitingen

Twee samenvattingen van één zin:

Een afsluiting zijn de lokale variabelen voor een   functie - levend gehouden na de   functie is teruggekeerd, of

Een sluiting is een stack-frame dat is   niet uitgezet wanneer de functie   komt terug. (alsof er een 'stack-frame' was   malloc'ed in plaats van op de   stack!)

Een zeer goed artikel over sluitingen

Javascript-sluitingen

Een "sluiting" is een uitdrukking   (meestal een functie) die kan hebben   gratis variabelen samen met een   omgeving die die variabelen bindt   (dat de uitdrukking "sluit").

De eenvoudige uitleg van een afsluiting is   dat ECMAScript innerlijk toelaat   functies; functiedefinities en   functie-uitdrukkingen die binnen zijn   de functielichamen van andere functies.   En dat die innerlijke functies zijn   toegang tot alle lokale   variabelen, parameters en gedeclareerd   innerlijke functies binnen hun uiterlijke   functie (s). Een sluiting wordt gevormd wanneer   een van die innerlijke functies is gemaakt   toegankelijk buiten de functie in   welke het bevatte, zodat het dat kan   worden uitgevoerd na de uiterlijke functie   is teruggekomen. Op welk moment is het nog steeds   heeft toegang tot de lokale variabelen,   parameters en innerlijke functie   verklaringen van zijn uiterlijke functie.   Die lokale variabelen, parameter en   functie-verklaringen (initieel) hebben   de waarden die ze hadden toen de   externe functie geretourneerd en mogelijk   in wisselwerking met de innerlijke functie.

Een goed voorbeeld hier

JavaScript, tijd voor grok-sluitingen


44
2017-11-26 06:57



Het is een functie die een referentie of verwijzingen naar iets in een andere scope "houdt". Bijvoorbeeld:

var myArrayOfFunctions = [];

for(var i = 0; i<3: i++)
{
    //Note how the function being defined uses i, 
    //where i lives in the parent's scope, this creates a closure
    myArrayOfFunctions[i] = function(a) { return a + i;}    
}

myArrayOfFunctions[0](5);   //Prints 8 WTF!
myArrayOfFunctions[1](5);   //8 again
myArrayOfFunctions[2](5);   //Well, this 8 was expected

Dit gebeurt omdat wanneer de functies "gecreëerd" worden, ze de waarde van i niet kopiëren, ze houden een verwijzing naar i, dus als we de functies aanroepen gebruiken ze de huidige waarde van i die 3 is.

Hier is een grafische uitleg.


6
2017-11-26 07:09



Voor mij maken de sluitingen in JS het u mogelijk om het volgende te doen.
"a" blijft beschikbaar in de innerlijke functie wanneer het wordt toegevoegd aan "b", hoewel het buiten wordt verklaard.

function adder(a){
  return function(b){
    return a + b;
  };
}
var add5 = adder(5);
alert( add5(10) );

Voor een extreem gebruik van JS-sluitingen, kunt u een kijkje nemen bij de broncode van de PURE bibliotheek (een JS sjabloon-engine)


4
2017-11-26 16:44



Voor zover ik weet, is een afsluiting een functie die is gedefinieerd in een andere functie die de reikwijdte van de hoofdfunctie overleeft. Een bekend voorbeeld zijn callbacks:

function delay_message(msg)
{
     setTimeout(function closure() { alert(msg); }, 1000);
}

In dit geval, het bovenstaande function closure is gedefinieerd in de body van delay_message, maar de functiedefinitie - evenals de variabele van de hoofdfunctie msg - overleef de reikwijdte van de delay_message functieaanroep.


2
2017-11-26 06:59



Beschouw de volgende code die een afsluiting creëert met de variabelen a en b

closure=(function(){ 

    var a=3
    var b=5 

return  function(operation){ 
          return operation(a,b)
      }
 }())


// The variables a and b are now part of the closure (They are retained even after the outer function returns)


closure(function(x,y){return x+y})  // outputs 8

closure(function(x,y){return x*y}) // outputs 15`

Deze specifieke sluiting kan nu elke functie gebruiken die werkt op de variabelen a en b


2
2017-11-11 23:52



In wezen is een afsluiting een functie-instantie die gesloten is over de identificaties (variabelen) binnen zijn lokale omgeving.


1
2017-11-26 16:50



Een afsluiting is een functiewaarde die is gecreëerd op basis van een geneste functie-declaratie of functie-uitdrukking (d.w.z. lambda-uitdrukking) waarvan het lichaam één of meer verwijzingen bevat naar variabelen die zijn gedeclareerd in een buitenste (maar niet globale) scope.


1
2018-03-20 01:09