„JavaScript“ uždarymai

Šioje pamokoje su pavyzdžių pagalba sužinosite apie „JavaScript“ uždarymus.

Prieš sužinodami apie uždarymus, turite suprasti dvi sąvokas:

  • Įdėta funkcija
  • Grąžina funkciją

„JavaScript“ įdėta funkcija

„JavaScript“ funkcijoje taip pat gali būti kita funkcija. Tai vadinama įdėta funkcija. Pavyzdžiui,

 // 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

Pirmiau minėtoje programoje greet()funkcija turi displayName()funkciją jos viduje.

Funkcijos grąžinimas

„JavaScript“ taip pat galite grąžinti funkciją funkcijos viduje. Pavyzdžiui,

 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

Rezultatas

 funkcija displayName () (console.log ('Hi' + '' + name);) Sveikas, John

Pirmiau pateiktoje programoje greet()funkcija grąžina displayNamefunkcijos apibrėžimą.

Čia grąžinamas funkcijos apibrėžimas priskiriamas kintamajam g1. Kai spausdinsite g1 naudodami console.log(g1), gausite funkcijos apibrėžimą.

Norėdami iškviesti funkciją, saugomą kintamajame g1, naudojame g1()su skliaustais.

„JavaScript“ uždarymai

„JavaScript“ sistemoje uždarymas suteikia prieigą prie išorinės funkcijos apimties iš vidinės funkcijos, net ir tada, kai išorinė funkcija yra uždaryta. Pavyzdžiui,

 // 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

Rezultatas

 funkcija displayName () (// prieiga prie vardo kintamojo grąžina „Hi“ + “+ vardas;

Ankstesniame pavyzdyje, kai greet()iškviečiama funkcija, ji pateikia funkcijos apibrėžimą displayName.

Čia g1yra nuoroda į displayName()funkciją.

Kai g1()iškviečiamas, jis vis tiek turi prieigą prie greet()funkcijos.

Kai mes paleidžiame console.log(g1), jis pateikia funkcijos apibrėžimą.

Uždarymo samprata egzistuoja ir kitose programavimo kalbose, tokiose kaip Python, Swift, Ruby ir kt.

Pažvelkime į kitą pavyzdį.

 // 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

Pirmiau pateiktoje programoje calculate()funkcija užima vieną argumentą xir pateikia funkcijos apibrėžimą multiply(). multiply()Funkcija trunka vieną argumentą yir grįžta x * y.

Ir vienas, multiply3ir kitas multiply4yra uždarymas.

calculate()Funkcija yra vadinama kelias parametrą x. Kai multiply3ir multiply4yra iškviečiami, multipy()funkcija turi prieigą prie perduoto x išorinės calculate()funkcijos argumento .

Duomenų privatumas

„JavaScript“ uždarymas padeda apsaugoti programos duomenis. Pavyzdžiui,

 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

Ankstesniame pavyzdyje sum()funkcija grąžina funkcijos apibrėžimą increaseSum().

increaseSum()Funkcijos viduje kintamasis padidinamas . Tačiau kintamojo reikšmę galima keisti ir už funkcijos ribų. Šiuo atveju a = a + 1;keičiama kintamojo vertė už funkcijos ribų.

Dabar, jei norite, kad kintamasis būtų padidintas tik funkcijos viduje, galite naudoti uždarymą. Pavyzdžiui,

 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

Ankstesniame pavyzdyje sum()funkcija nustato a reikšmę į 0 ir grąžina increaseSum()funkciją.

Dėl uždarymo, nors sum()jis jau įvykdytas, jis increaseSum()vis tiek turi prieigą prie ir kiekvieną kartą, kai iškviečiamas, gali pridėti 1x() .

Kintamasis yra privatus sum()funkcijai. Tai reiškia, kad kintamąjį galima pasiekti tik sum()funkcijos viduje .

Net jei jūs deklaruojate air naudojate, tai neturi įtakos funkcijos aviduje esančiam kintamajam sum().

Pastaba : paprastai duomenų uždarymui naudojami uždarymai.

Įdomios straipsniai...