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 displayName
funktsioon 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 g1
on 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 x
ja tagastab funktsiooni funktsiooni definitsiooni multiply()
. multiply()
Funktsioon võtab ühe argumendi y
ja naaseb x * y
.
Mõlemad multiply3
ja multiply4
on sulgemised.
calculate()
Funktsiooni nimetatakse associated parameeter x
. Kui multiply3
ja multiply4
kutsutakse, 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 a
ja kasutate seda, ei mõjuta a
see sum()
funktsiooni muutujat .
Märkus . Üldiselt kasutatakse andmete privaatsuse huvides sulgemisi.