Ultimele tutoriale de dezvoltare web
 

JavaScript Closures


Variabilele JavaScript pot aparține domeniului de aplicare locală sau globală.

Variabilele private pot fi posibile cu sisteme de închidere.


Variabilele globale

O funcție poate avea acces la toate variabilele definite in interiorul functiei, ca aceasta:

Exemplu

function myFunction() {
    var a = 4;
    return a * a;
}
Încearcă - l singur »

Dar o funcție poate accesa , de asemenea variabile definite în afara funcției, cum ar fi aceasta:

Exemplu

var a = 4;
function myFunction() {
    return a * a;
}
Încearcă - l singur »

În ultimul exemplu, o este o variabilă globală.

Într-o pagină web, variabile globale aparțin obiectului fereastră.

Variabilele globale pot fi utilizate (and changed) de către toate script - urile din pagina (and in the window) .

În primul exemplu, a este o variabilă locală.

O variabilă locală poate fi utilizată numai în interiorul funcției în care este definită. Acesta este ascuns de alte funcții și un alt cod de scripting.

Variabilele globale și locale cu același nume sunt variabile diferite. Modificarea unul, nu modifică cealaltă.

Variabilele create fără cuvântul cheie var, sunt întotdeauna la nivel mondial, chiar dacă acestea sunt create în interiorul unei funcții.


Durata de viață variabilă

Variabilele globale trăiesc, atâta timp cât cererea dumneavoastră (fereastra / pagina web) trăiește.

Variabilele locale au vieți scurte. Ele sunt create atunci când funcția este invocată, și șterse atunci când funcția este terminat.


Un Dilemma Counter

Să presupunem că doriți să utilizați o variabilă pentru numărare ceva, si doriti acest contor să fie disponibile pentru toate funcțiile.

Ai putea folosi o variabilă globală, și o funcție pentru a crește contorul:

Exemplu

var counter = 0;

function add() {
    counter += 1;
}

add();
add();
add();

// the counter is now equal to 3
Încearcă - l singur »

Contorul trebuie modificate numai de add() funcția.

Problema este, că orice script pe pagina poate schimba contorul, fără a apela add() .

Dacă Declar contorul în interiorul funcției, nimeni nu va putea să - l schimbe , fără a pune add() :

Exemplu

function add() {
    var counter = 0;
    counter += 1;
}

add();
add();
add();

// the counter should now be 3, but it does not work !
Încearcă - l singur »

N-a funcționat! De fiecare dată când eu numesc add() funcția, contorul este setat la 1.

O funcție interioară JavaScript poate rezolva acest lucru.


Funcții JavaScript imbricate

Toate funcțiile au acces la domeniul de aplicare la nivel mondial.

De fapt, în JavaScript, toate funcțiile au acces la domeniul de aplicare "above" de "above" ei.

JavaScript acceptă funcțiile imbricate. Funcțiile imbricate au acces la domeniul de aplicare "above" de "above" ei.

In acest exemplu, funcția interior plus() are acces la variabila contor în funcția părinte:

Exemplu

function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();   
    return counter;
}
Încearcă - l singur »

Acest lucru ar putea fi rezolvat dilema contra, dacă am putea ajunge la plus() funcția din exterior.

De asemenea, trebuie să găsim o modalitate de a executa contra = 0 numai o singură dată.

Avem nevoie de o închidere.


Închideri JavaScript

Amintiți-vă funcții auto-invocînd? Ce face această funcție?

Exemplu

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();

add();
add();
add();

// the counter is now 3
Încearcă - l singur »

exemplu explicat

Programul de completare variabilă i se atribuie valoarea de returnare a unei funcții de auto - invocînd.

Funcția de auto-invocînd se execută o singură dată. Acesta setează contorul la zero (0) , și returnează o expresie funcție.

Astfel, devine o adăugare în funcție. "wonderful" parte este că acesta poate avea acces la ghișeu în domeniul de aplicare părinte.

Aceasta se numește o închidere JavaScript. Aceasta face posibil ca o funcție de a avea " private " variabile.

Contorul este protejat de domeniul de aplicare al funcției anonim, și pot fi modificate numai cu ajutorul funcției de adăugare.

O închidere este un acces având funcții la domeniul de aplicare-mamă, chiar și după funcția de părinte a închis.