Zapiranje JavaScript

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 displayNamedefinicijo 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 g1je 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 xin vrne definicijo multiply()funkcije. multiply()Funkcija ima en sam argument yin vrne x * y.

Oba multiply3in multiply4sta zaprtja.

calculate()Funkcija se imenuje mimo parameter x. Ko so multiply3in multiply4poklič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 ain uporabite, to ne vpliva na aspremenljivko znotraj sum()funkcije.

Opomba : Na splošno se zapiranja uporabljajo za zasebnost podatkov.

Zanimive Članki...