V tej vadnici boste s pomočjo primerov izvedeli več o zapiranju JavaScript.
Preden se naučite o zaprtjih, morate razumeti dva pojma:
- Vgnezdena funkcija
- Vrnitev funkcije
Vgnezdena funkcija JavaScript
V JavaScript lahko funkcija vsebuje tudi drugo funkcijo. To se imenuje ugnezdena funkcija. Na primer
// 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
V zgornjem programu greet()
funkcija vsebuje displayName()
funkcijo znotraj njega.
Vrnitev funkcije
V JavaScript lahko funkcijo vrnete tudi znotraj funkcije. Na primer
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
Izhod
funkcija displayName () (console.log ('Hi' + '' + ime);) Živijo John
V zgornjem programu greet()
funkcija vrne displayName
definicijo funkcije.
Tu je vrnjena definicija funkcije dodeljena spremenljivki g1. Ko natisnete g1 z uporabo console.log(g1)
, boste dobili definicijo funkcije.
Za klic funkcije, shranjene v spremenljivki g1, uporabljamo g1()
oklepaje.
Zapiranje JavaScript
V JavaScript zapiranje omogoča dostop do zunanjega obsega funkcije znotraj notranje funkcije, tudi po zaprtju zunanje funkcije. Na primer
// 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
Izhod
function displayName () (// dostop do spremenljivke imena return 'Hi' + '' + name;) Živijo John
V zgornjem primeru, ko greet()
pokliče funkcijo, vrne definicijo funkcije displayName
.
Tukaj g1
je sklic na displayName()
funkcijo.
Ko g1()
je poklican, ima še vedno dostop do greet()
funkcije.
Ko zaženemo console.log(g1)
, vrne definicijo funkcije.
Koncept zapiranja obstaja za druge programske jezike, kot so Python, Swift, Ruby itd.
Oglejmo si še en primer.
// 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
V zgornjem programu calculate()
funkcija vzame en argument x
in vrne definicijo multiply()
funkcije. multiply()
Funkcija ima en sam argument y
in vrne x * y
.
Oba multiply3
in multiply4
sta zaprtja.
calculate()
Funkcija se imenuje mimo parameter x
. Ko so multiply3
in multiply4
pokličejo, ima multipy()
funkcija dostop do posredovanega argumenta x zunanje calculate()
funkcije.
Zasebnost podatkov
Zapiranje JavaScript pomaga pri zasebnosti podatkov programa. Na primer
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
V zgornjem primeru sum()
funkcija vrne definicijo increaseSum()
funkcije.
Spremenljivka se poveča znotraj increaseSum()
funkcije. Vrednost spremenljivke pa lahko spremenite tudi zunaj funkcije. V tem primeru a = a + 1;
spremeni vrednost spremenljivke zunaj funkcije.
Če želite spremenljivko povečati samo znotraj funkcije, lahko uporabite zapiranje. Na primer
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
V zgornjem primeru sum()
funkcija nastavi vrednost a na 0 in vrne increaseSum()
funkcijo.
Zaradi zaprtja, čeprav sum()
je že izveden, increaseSum()
ima še vedno dostop do in lahko vsakič, ko se pokliče, doda 1x()
.
In spremenljivka je zasebna za sum()
funkcijo. To pomeni, da je do spremenljivke mogoče dostopati samo znotraj sum()
funkcije.
Tudi če jo prijavite a
in uporabite, to ne vpliva na a
spremenljivko znotraj sum()
funkcije.
Opomba : Na splošno se zapiranja uporabljajo za zasebnost podatkov.