JavaScripti sulgemised

Selles õpetuses saate näidete abil teada JavaScripti sulgemisest.

Enne sulgemisega tutvumist peate mõistma kahte mõistet:

  • Pesastatud funktsioon
  • Funktsiooni tagastamine

JavaScripti pesastatud funktsioon

JavaScripti funktsioonis võib funktsioon sisaldada ka teist funktsiooni. Seda nimetatakse pesastatud funktsiooniks. Näiteks,

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

Ülaltoodud programmis greet()sisaldab displayName()funktsioon selle sees olevat funktsiooni.

Funktsiooni tagastamine

JavaScripti abil saate funktsiooni funktsiooni sees ka tagastada. Näiteks,

 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

Väljund

 funktsiooni displayName () (console.log ('Tere' + '' + nimi);) Tere John

Ülaltoodud programmis greet()tagastab displayNamefunktsioon funktsiooni definitsiooni.

Siin omistatakse tagastatud funktsiooni määratlus muutujale g1. Kasutades funktsiooni g1 printimist console.log(g1), saate funktsiooni definitsiooni.

Muutuja g1 salvestatud funktsiooni kutsumiseks kasutame g1()sulgudes.

JavaScripti sulgemised

JavaScripti abil pakub sulgemine juurdepääsu funktsiooni välisele ulatusele sisefunktsiooni seest isegi pärast välise funktsiooni sulgemist. Näiteks,

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

Väljund

 function displayName () (// nimemuutujale juurdepääs tagastab 'Hi' + '' + nimi;) Tere John

Ülaltoodud näites greet()tagastab funktsiooni kutsumisel funktsiooni definitsiooni displayName.

Siin g1on viide displayName()funktsioonile.

Kui g1()helistatakse, on sellel endiselt greet()funktsioonile juurdepääs .

Kui käivitame console.log(g1), tagastab see funktsiooni definitsiooni.

Sulgemise mõiste on olemas ka teiste programmeerimiskeelte puhul, nagu Python, Swift, Ruby jne.

Vaatame veel ühte näidet.

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

Ülaltoodud programmis calculate()võtab funktsioon ühe argumendi xja tagastab funktsiooni funktsiooni definitsiooni multiply(). multiply()Funktsioon võtab ühe argumendi yja naaseb x * y.

Mõlemad multiply3ja multiply4on sulgemised.

calculate()Funktsiooni nimetatakse associated parameeter x. Kui multiply3ja multiply4kutsutakse, on multipy()funktsioonil juurdepääs välimise calculate()funktsiooni x argumentile .

Andmete privaatsus

JavaScripti sulgemine aitab kaasa programmi andmete privaatsusele. Näiteks,

 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

Ülaltoodud näites sum()tagastab funktsioon funktsiooni funktsiooni definitsiooni increaseSum().

Muutujat suurendatakse increaseSum()funktsiooni sees . Muutuja väärtust saab muuta ka väljaspool funktsiooni. Sellisel juhul a = a + 1;muudab muutuja väärtust väljaspool funktsiooni.

Kui soovite, et muutujat suurendataks ainult funktsiooni sees, võite kasutada sulgurit. Näiteks,

 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

Ülaltoodud näites sum()seab funktsioon a väärtuseks 0 ja tagastab increaseSum()funktsiooni.

Kuigi sulgemine sum()on juba täidetud, increaseSum()on tal siiski juurdepääs a-le ja iga kord, kui seda kutsutakse, saab sellele lisada 1x() .

Ja muutuja on sum()funktsiooni jaoks privaatne . See tähendab, et muutujale pääseb juurde ainult sum()funktsiooni sees .

Isegi kui deklareerite aja kasutate seda, ei mõjuta asee sum()funktsiooni muutujat .

Märkus . Üldiselt kasutatakse andmete privaatsuse huvides sulgemisi.

Huvitavad Artiklid...