? När en förslutning skapas i JavaScript , kan du referera lokala variabler i en funktion även efter att funktionen har avslutats , med de värden de hade vid slutet av funktionen . När du använder en funktion i en annan funktion , använd " eval " inuti en annan funktion eller definiera en variabel inuti en funktion utan " var , " du skapar en nedläggning . Många programmerare skapa nedläggningar utan att inse det genom att definiera en anonym funktion inom en funktion . Nedläggningar är användbart när du vill skicka variabler till händelsehanterare eller AJAX funktioner callback och att efterlikna privata variabler och metoder i JavaScript-objekt . Var försiktig när du skapar nedläggningar , men eftersom de kan orsaka minnesläckor i Microsoft Internet Explorer . Förstå Nedläggningar
JavaScript och de flesta andra programmeringsspråk , de lokala variablerna i en funktion förstörs efter funktionen avslutas . Men , när du skapar en funktion i en annan funktion i JavaScript , de lokala variablerna i den yttre funktionen bevaras även efter det slutar eftersom variablerna kan refereras av den inre funktionen . Exemplet nedan innehåller en funktion " pristagare " som skapar en nedläggning genom en anonym funktion , som den returnerar . Vi kallar det anonym funktion direkt från utsidan utan att ens gå igenom den överordnade funktionen :
funktion pristagare ( namn ) {var vinnaren = " Du vinner priset , " + namn , var tillkännage = function ( ) { alert (vinnare ) ;} ; if ( Math.floor ( Math.random ( ) * 11 ) == 7 ) återvänder meddela , returnera null ; }
if ( var Sayit = pristagare ( " Steve " ) ) Sayit ( ) ; Addera skicka parametrar till händelsehanterare
En användning av nedläggningar är att variabler som till händelsehanterare . Betrakta följande exempel där en nedläggning är skapad av en anonym funktion definierad i " setHandler . " Den anonyma funktionen refererar till en parameter för " setHandler . " Vid den punkt händelsen bränder , även om " setHandler " är klar , är värdena på dess variabler, inklusive dess parametrar , vid funktionen slutsats bevaras för anonym funktion . En separat förslutning skapas för varje iteration i slingan .
Funktion setHandler ( dörr , pris ) { door.addEventListener ( " click" , function ( ) { alert ( " Priset för dörren " + dörr + " är " + pris) ; } , false ) ; }
window.onload = function ( ) { for (var i = 1 ; i < = 3 ; i + + ) { setHandler ( document.getElementById ( " door " + i) , pris [ i] ) ; } }
skicka parametrar till AJAX callback-funktionerna
liknande till det tidigare exemplet , vi kan skicka parametrar till AJAX callback-funktionerna med nedläggningar . Om du gör ett AJAX samtal under vilket begäran variabeln är global , har du eliminerat chansen att skicka en parameter till callback-funktionen eftersom en enda global förfrågan skapas . Genom att göra förfrågan variabeln lokal , kan du skapa en stängning och ge tillgång callback-funktion till begäran - specifika uppgifter . I exemplet nedan , skapar vi en stängning genom att definiera callback-funktion som använder en variabel lokal till sin överordnade funktion . En separat återuppringning skapas för var och en av de 10 " makeRequest " samtal
funktionsprocessen () { för . ( Var i = 0 ; i < 10 , i + +) { makeRequest ( i) ;}
funktion makeRequest ( vilken ) {var begäran, var useThis = lookup ( vilka ) , om ( window.XMLHttpRequest ) { begäran = new XMLHttpRequest ( ) ;} else if ( window.ActiveXObject ) { begäran = ny ActiveXObject ( " Microisoft.XMLHTTP " ) ;} request.onreadystatechange = function ( ) { parse ( useThis ) ;} request.open ( " GET " , url ) , request.send ( ) ;}
Privat variabler och metoder i JavaScript
JavaScript , alla medlemmar av ett objekt är offentliga , till skillnad från vissa andra objektorienterade språk som tillåter privata variabler och metoder . Nedläggningar tillåter dig att emulera privata metoder och variabler i JavaScript . I följande exempel objektet " hemligheter " skapas och exekveras vid definition . När den körs , innehåller det ett anonymt objekt med två metoder : " show " och " super ", som tar en parameter . Både variabeln " hemligkod " och funktionen " superSecret " kan endast nås genom de två metoderna i " hemligheter " objektet . I själva verket är de privata medlemmar i
var- hemligheter = function ( ) {var hemligkod = ( ( ( 1 + Math.random ( ) ) * 0x100000 )