Hva er Nedleggelser God for i Javascript?

Når en nedleggelse er opprettet i Javascript, kan du referere til lokale variabler av en funksjon, selv etter at funksjonen er avsluttet, med de verdiene de hadde ved utgangen av funksjonen. Når du bruker en funksjon inne i en annen funksjon, bruk "eval" inne i en annen funksjon eller definere en variabel i en funksjon uten "var," du opprette en nedleggelse. Mange programmerere lage nedleggelser uten å vite det ved å definere en anonym funksjon innenfor en funksjon. Nedleggelser er nyttig når du ønsker å passere variabler til hendelseshåndterere eller AJAX tilbakeringing funksjoner og å etterligne private variabler og metoder i Javascript objekter. Vær forsiktig når du oppretter nedleggelser, men fordi de kan føre til minnelekkasjer i Microsoft Internet Explorer.

forstå Nedleggelser

I Javascript og de fleste andre programmeringsspråk, er de lokale variablene i en funksjon ødelagt etter at funksjonen slutter. Men når du oppretter en funksjon i en annen funksjon i Javascript, er de lokale variabler av den ytre funksjonen bevares selv etter at den opphører fordi variablene kan bli referert av den indre funksjonen. Eksemplet nedenfor inneholder en funksjon "prisvinner" som skaper en nedleggelse gjennom en anonym funksjon, som den returnerer. Vi kaller det anonym funksjon direkte fra utsiden uten å gå gjennom den overordnede funksjon:

funksjon prisvinner (navn) {
Var vinneren = "Du vinner premien," + navn;
Var kunn = function () {alert (vinner); };
if (Math.floor (Math.random () * 11) == 7) tilbake kunn;
returnere null;
}

hvis (var sayit = prisvinner ( "Steve")) sayit ();

Passing Parametere til hendelseshåndterere

En bruk av nedleggelser er å gjøre variabler tilgjengelig for hendelseshåndterere. Betrakt følgende eksempel der en nedleggelse er skapt av en anonym funksjon definert i "setHandler." Den anonym funksjon refererer til en parameter av "setHandler." På det punktet hendelses brannene, selv om "setHandler" er ferdig, verdiene av variablene, inkludert parameterne, på funksjon konklusjon er bevart for anonym funksjon. En separat lukke opprettes for hver iterasjon i sløyfen.

funksjon setHandler (dør, premie) {

door.addEventListener("click", function() {
alert("Prize for door " + door + " is " + prize);
}, false);

}

window.onload = function () {
for (var i = 1; i <= 3; i ++) {

setHandler(document.getElementById(&quot;door&quot;+i), prize[i]);

}
}

Passing Parametere til AJAX tilbakeringing funksjoner

I likhet med forrige eksempel, kan vi sende parametre til AJAX tilbakeringing funksjoner med nedleggelser. Hvis du gjør en AJAX samtale der anmodningen variabelen er global, har du eliminert muligheten til å passere en parameter for å tilbakeringingsfunksjonen fordi en enkelt global avtale er opprettet. Ved å gjøre forespørselen variabel lokal, kan du opprette en nedleggelse og gi tilbakeringingsfunksjonen tilgang til forespørsel spesifikke data. I eksempelet nedenfor, skaper vi en nedleggelse ved å definere tilbakeringingsfunksjon som bruker en variabel lokale til sin overordnede funksjon. En egen tilbakeringing er opprettet for hver av de 10 "makeRequest" samtaler.

funksjon prosess () {
for (var i = 0; i <10; i ++) {
makeRequest (i);
}

fungere makeRequest (som) {
Var forespørsel;
Var useThis = oppslag (som);
if (window.XMLHttpRequest) {
request = ny XMLHttpRequest ();
} Else if (window.ActiveXObject) {
request = ny ActiveXObject ( "Microisoft.XMLHTTP");
}
request.onreadystatechange = function () {parse (useThis); }
request.open ( "GET", url);
request.send ();
}

Private variabler og metoder i Javascript

I Javascript, alle medlemmer av et objekt er offentlige, i motsetning til enkelte andre objektorienterte språk som gjør det mulig for private variabler og metoder. Nedleggelser tillate deg å etterligne private metoder og variabler i Javascript. I følgende eksempel, er objektet "hemmeligheter" laget og utført på definisjon. Når henrettet, den inneholder en anonym objekt med to metoder: "show" og "super", som tar en parameter. Både variabelen "Secret" og funksjonen "Super" kan bare nås gjennom de to metodene i "hemmeligheter" objekt. I praksis er de private medlemmer av "hemmeligheter".

Var hemmeligheter = funksjon () {

var secretCode = (((1+Math.random())*0x100000)|0).toString(16).substring(3,5);
var superSecret = function(hash) {
return encrypted(hash);
}

komme tilbake {
Showet: function () {
alert (Secret);
}

super: function (hash) {
alert (Super (hash));
}
}

} ();