Šajā apmācībā jūs uzzināsit par JavaScript slēgšanu, izmantojot piemērus.
Pirms uzzināt par slēgšanu, jums jāsaprot divi jēdzieni:
- Ligzdota funkcija
- Funkcijas atgriešana
JavaScript ligzdota funkcija
JavaScript valodā funkcija var saturēt arī citu funkciju. To sauc par ligzdotu funkciju. Piemēram,
// 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
Iepriekš minētajā programmā greet()
funkcija satur displayName()
funkciju tās iekšpusē.
Funkcijas atgriešana
JavaScript jūs varat arī atgriezt funkciju funkcijas ietvaros. Piemēram,
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
Rezultāts
funkcija displayName () (console.log ('Hi' + '' + name);) Sveiks, Džon
Iepriekš minētajā programmā greet()
funkcija atgriež displayName
funkcijas definīciju.
Šeit atgrieztā funkcijas definīcija tiek piešķirta mainīgajam g1. Drukājot g1, izmantojot funkciju console.log(g1)
, jūs saņemsiet funkcijas definīciju.
Lai izsauktu mainīgajā g1 saglabāto funkciju, mēs to izmantojam g1()
ar iekavām.
JavaScript aizvēršana
JavaScript valodā aizvēršana nodrošina piekļuvi funkcijas ārējai darbības jomai no iekšējās funkcijas iekšpuses pat pēc ārējās funkcijas aizvēršanas. Piemēram,
// 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
Rezultāts
funkcija displayName () (// piekļūstot nosaukuma mainīgajam, atgriežam “Hi” + ”” + nosaukums;) Sveiks, Džon
Iepriekš minētajā piemērā, kad greet()
tiek izsaukta funkcija, tā atgriež funkcijas definīciju displayName
.
Šeit g1
ir atsauce uz displayName()
funkciju.
Kad g1()
tiek izsaukts, tai joprojām ir piekļuve greet()
funkcijai.
Kad mēs palaižam console.log(g1)
, tas atgriež funkcijas definīciju.
Aizvēršanas jēdziens pastāv citām programmēšanas valodām, piemēram, Python, Swift, Ruby utt.
Apskatīsim citu piemēru.
// 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
Iepriekš minētajā programmā calculate()
funkcija aizņem vienu argumentu x
un atgriež funkcijas funkcijas definīciju multiply()
. multiply()
Funkcija aizņem vienu argumentu y
un atdevi x * y
.
Abi multiply3
un multiply4
ir slēgšana.
calculate()
Funkcija tiek saukta iet parametrs x
. Kad multiply3
un multiply4
tiek izsaukti, multipy()
funkcijai ir piekļuve ārējās calculate()
funkcijas nodotajam x argumentam .
Datu privātums
JavaScript aizvēršana palīdz nodrošināt programmas datu konfidencialitāti. Piemēram,
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
Iepriekš minētajā piemērā sum()
funkcija atgriež funkcijas funkcijas definīciju increaseSum()
.
Mainīgais tiek palielināts increaseSum()
funkcijas iekšpusē . Tomēr mainīgā lielumu var mainīt arī ārpus funkcijas. Šajā gadījumā a = a + 1;
mainās mainīgā vērtība ārpus funkcijas.
Tagad, ja vēlaties, lai mainīgais tiktu palielināts tikai funkcijas iekšpusē, varat izmantot slēgšanu. Piemēram,
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
Iepriekš minētajā piemērā sum()
funkcija vērtību a iestata uz 0 un atgriež increaseSum()
funkciju.
Slēgšanas dēļ, lai arī sum()
tas jau ir izpildīts, increaseSum()
joprojām ir piekļuve un ikreiz, kad tiek izsaukts, var pievienot 1x()
.
Mainīgais lielums ir privāts sum()
funkcijai. Tas nozīmē, ka mainīgajam var piekļūt tikai sum()
funkcijas iekšpusē .
Pat ja jūs to deklarējat a
un izmantojat, tas neietekmē a
mainīgo sum()
funkcijas iekšpusē .
Piezīme . Parasti datu konfidencialitātei tiek izmantotas slēgšanas.