JavaScript aizvēršana

Š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ž displayNamefunkcijas 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 g1ir 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 xun atgriež funkcijas funkcijas definīciju multiply(). multiply()Funkcija aizņem vienu argumentu yun atdevi x * y.

Abi multiply3un multiply4ir slēgšana.

calculate()Funkcija tiek saukta iet parametrs x. Kad multiply3un multiply4tiek 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 aun izmantojat, tas neietekmē amainīgo sum()funkcijas iekšpusē .

Piezīme . Parasti datu konfidencialitātei tiek izmantotas slēgšanas.

Interesanti raksti...