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.








