Als er een sluiting is gemaakt in JavaScript , kunt u lokale variabelen van een functie verwijzen , zelfs nadat de functie is beëindigd , met de waarden die ze hadden bij het sluiten van de functie . Wanneer u een functie gebruiken in een andere functie , gebruik " eval " binnen een andere functie of definieer een variabele in een functie zonder " var , " u een afsluiting te creëren. Veel programmeurs sluitingen te maken zonder het te beseffen door het definiëren van een anonieme functie binnen een functie . Sluitingen zijn nuttig wanneer u wilt variabelen doorgeven aan event handlers of AJAX callback functies en private variabelen en methoden in de JavaScript-objecten emuleren . Wees voorzichtig bij het maken van sluitingen , echter, omdat ze geheugen lekken kunnen veroorzaken in Microsoft Internet Explorer . Inzicht sluitingen JavaScript en de meeste andere programmeertalen , zijn de lokale variabelen van een functie vernietigd nadat de functie eindigt . Echter , wanneer u een functie binnen een andere functie in JavaScript maken , de lokale variabelen van de buitenste functie worden zelfs behouden nadat het eindigt , omdat de variabelen kan worden verwezen door de innerlijke functie . Het onderstaande voorbeeld bevat een functie ' laureaat ' , dat een afsluiting ontstaat door een anonieme functie , waarin het terugkeert . We noemen dat de anonieme functie rechtstreeks van buiten zonder zelfs gaan door de ouder -functie : functie prijswinnaar ( naam ) { var winnaar = " Je wint de hoofdprijs , " + naam ; var kondigen = function ( ) { alert ( winnaar ) ;} if ( Math.floor ( Math.random ( ) * 11 ) == 7 ) terug te kondigen ; terug null; } if ( var sayit = prijswinnaar ( " Steve " ) ) sayit ( ) ; parameters doorgeven aan event handlers Een gebruik van sluitingen is om variabelen beschikbaar om event handlers maken . Neem het volgende voorbeeld waarin een afsluiting wordt gecreëerd door een anonieme functie gedefinieerd in " SetHandler . " De anonieme functie referenties een parameter van ' SetHandler . "Op het moment van de gebeurtenis branden, ook al is" SetHandler " klaar is de waarden van de variabelen, zoals de parameters , de conclusie van de functie worden bewaard voor de anonieme functie . Een aparte sluiting wordt gemaakt voor elke iteratie van de lus . Functie SetHandler ( deur , prijs) { door.addEventListener ( " click" , function ( ) {alert ( " Prijs voor de deur " + deur + " is " + prijs) ;} , false) ; } window.onload = function ( ) { for ( var i = 1 ; i < = 3 ; i + + ) { SetHandler ( document.getElementById ( " deur" + i ) , prijs [ i ] ) ; } } parameters doorgeven aan AJAX functies Terugbellen Vergelijkbaar met het vorige voorbeeld , we kunnen parameters aan AJAX callback-functies met sluitingen . Als je een AJAX call waarin het verzoek variabele is globaal te maken, heb je de kans om een parameter doorgeven aan de callback functie omdat een enkele algemene aanvraag wordt gecreëerd geëlimineerd . Door het maken van het verzoek variabele lokale , kunt u een afsluiting te creëren en geven de callback functie toegang tot verzoek - specifieke gegevens . In het onderstaande voorbeeld maken we een afsluiting door het definiëren van de callback -functie die gebruik maakt van een variabele lokaal aan haar moedermaatschappij functie . Een aparte callback wordt gemaakt voor elk van de 10 " makeRequest " gesprekken functie proces ( ) { voor . ( Var i = 0 ; i < 10 ; i + + ) { makeRequest ( i ) ; } functie makeRequest (wat ) { var verzoek ; var useThis = lookup (die ) if ( window.XMLHttpRequest ) { aanvraag = new XMLHttpRequest ( ) ; } else if ( window.ActiveXObject ) { aanvraag = new ActiveXObject ( " Microisoft.XMLHTTP " ) ; } request.onreadystatechange = function ( ) { parse ( useThis ) ;} request.open ( " GET " , url ) ; request.send ( ) ; } Prive variabelen en methoden in JavaScript JavaScript , alle leden van een object zijn publiek , in tegenstelling tot sommige andere objectgeoriënteerde talen die het mogelijk maken voor prive- variabelen en methoden . Sluitingen toelaten om private methoden en variabelen in JavaScript emuleren . In het volgende voorbeeld , het object " geheimen " is gecreëerd en uitgevoerd bij de definitie . Als het wordt uitgevoerd , bevat het een anoniem object met twee methoden: "show" en " super ", die een parameter neemt . Zowel de variabele " secretCode " en de functie " supergeheime " is alleen toegankelijk via de twee methoden in de " geheimen " object . In feite , ze zijn particuliere leden van var geheimen = function ( ) { var secretCode = ( ( ( 1 + Math.random ( ) ) * 0x100000 ) | 0 ) " geheimen . " . ToString ( . 16 ) substring (3,5 ) ; var supergeheime = function ( hash ) { return gecodeerde ( hash ) ; } terugkeer { tonen : function ( ) {alert ( secretCode ) ;} , super : functie ( hash ) { alert ( supergeheime ( hash ) ) ; } } } ( ) ;
|