În acest tutorial, veți afla despre închiderile JavaScript cu ajutorul exemplelor.
Înainte de a afla despre închideri, trebuie să înțelegeți două concepte:
- Funcția imbricată
- Revenirea unei funcții
Funcția imbricată JavaScript
În JavaScript, o funcție poate conține și o altă funcție. Aceasta se numește funcție imbricată. De exemplu,
// nested function example // outer function function greet(name) ( // inner function function displayName() ( console.log('Hi' + ' ' + name); ) // calling inner function displayName(); ) // calling outer function greet('John'); // Hi John
În programul de mai sus, greet()
funcția conține displayName()
funcția din interiorul acestuia.
Revenirea unei funcții
În JavaScript, puteți returna și o funcție în cadrul unei funcții. De exemplu,
function greet(name) ( function displayName() ( console.log('Hi' + ' ' + name); ) // returning a function return displayName; ) const g1 = greet('John'); console.log(g1); // returns the function definition g1(); // calling the function
Ieșire
funcție displayName () (console.log ('Bună' + '' + nume);) Bună John
În programul de mai sus, greet()
funcția returnează displayName
definiția funcției.
Aici, definiția funcției returnate este atribuită variabilei g1. Când tipăriți g1 folosind console.log(g1)
, veți obține definiția funcției.
Pentru a apela funcția stocată în variabila g1, folosim g1()
cu paranteze.
Închideri JavaScript
În JavaScript, închiderea oferă acces la sfera exterioară a unei funcții din interiorul funcției interioare, chiar și după închiderea funcției externe. De exemplu,
// javascript closure example // outer function function greet() ( // variable defined outside the inner function let name = 'John'; // inner function function displayName() ( // accessing name variable return 'Hi' + ' ' + name; ) return displayName; ) const g1 = greet(); console.log(g1); // returns the function definition console.log(g1()); // returns the value
Ieșire
funcție displayName () (// accesând variabila nume returnează „Bună” + ”+ nume;) Bună Ioan
În exemplul de mai sus, când greet()
funcția este apelată, returnează definiția funcției de displayName
.
Iată g1
o referință la displayName()
funcție.
Când g1()
este apelat, acesta are încă acces la greet()
funcție.
Când rulăm console.log(g1)
, returnează definiția funcției.
Conceptul de închidere există pentru alte limbaje de programare precum Python, Swift, Ruby etc.
Să aruncăm o privire la un alt exemplu.
// closure example function calculate(x) ( function multiply(y) ( return x * y; ) return multiply; ) const multiply3 = calculate(3); const multiply4 = calculate(4); console.log(multiply3); // returns calculate function definition console.log(multiply3()); // NaN console.log(multiply3(6)); // 18 console.log(multiply4(2)); // 8
În programul de mai sus, calculate()
funcția ia un singur argument x
și returnează definiția multiply()
funcției funcției. multiply()
Functia ia un singur argument y
și se întoarce x * y
.
Ambele multiply3
și multiply4
sunt închideri.
calculate()
Funcția se numește trece un parametru x
. Când multiply3
și multiply4
sunt apelate, multipy()
funcția are acces la argumentul x trecut al calculate()
funcției externe .
Confidențialitatea datelor
Închiderea JavaScript ajută la confidențialitatea datelor din program. De exemplu,
let a = 0; function sum() ( function increaseSum() ( // the value of a is increased by 1 return a = a + 1; ) return increaseSum; ) const x = sum(); console.log(x()); // 1 console.log(x()); // 2 console.log(x()); // 3 a = a + 1; console.log(a); // 4
În exemplul de mai sus, sum()
funcția returnează definiția increaseSum()
funcției funcției.
Variabila a este mărită în interiorul increaseSum()
funcției. Cu toate acestea, valoarea variabilei a poate fi modificată și în afara funcției. În acest caz, a = a + 1;
modifică valoarea variabilei în afara funcției.
Acum, dacă doriți ca variabila a să fie mărită numai în interiorul funcției, puteți utiliza o închidere. De exemplu,
function sum() ( let a = 0; function increaseSum() ( // the value of a is increased by 1 return a = a + 1; ) return increaseSum; ) let x = sum(); let a = 5; console.log(x()); // 1 console.log(x()); // 2 console.log(a); // 5
În exemplul de mai sus, sum()
funcția setează valoarea lui a la 0 și returnează increaseSum()
funcția.
Din cauza închiderii, chiar dacă sum()
este deja executată, increaseSum()
are încă acces la un și poate adăuga 1 la un de fiecare dată când x()
este apelat.
Și variabila a este privată pentru sum()
funcție. Înseamnă că variabila a poate fi accesată numai în interiorul sum()
funcției.
Chiar dacă îl declarați a
și îl utilizați, acesta nu afectează a
variabila din interiorul sum()
funcției.
Notă : În general, închiderile sunt utilizate pentru confidențialitatea datelor.