V tomto tutoriále sa dozviete o ukončení JavaScriptu pomocou príkladov.
Predtým, ako sa dozviete o uzávierkach, musíte pochopiť dva pojmy:
- Vnorená funkcia
- Vrátenie funkcie
Vnorená funkcia JavaScript
V jazyku JavaScript môže funkcia obsahovať aj inú funkciu. Toto sa nazýva vnorená funkcia. Napríklad,
// 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
Vo vyššie uvedenom programe greet()
obsahuje displayName()
funkcia funkciu vo svojom vnútri.
Vrátenie funkcie
V JavaScripte môžete tiež vrátiť funkciu v rámci funkcie. Napríklad,
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ýkon
funkcia displayName () (console.log ('Hi' + '' + name);) Ahoj John
Vo vyššie uvedenom programe greet()
funkcia vracia displayName
definíciu funkcie.
Tu je definícii vrátenej funkcie priradená premenná g1. Keď tlačíte g1 pomocou console.log(g1)
, dostanete definíciu funkcie.
Na vyvolanie funkcie uloženej v premennej g1 použijeme g1()
zátvorky.
Uzávery JavaScriptu
V JavaScripte umožňuje uzavretie prístup k vonkajšiemu rozsahu funkcie z vnútornej strany vnútornej funkcie, a to aj po ukončení vonkajšej funkcie. Napríklad,
// 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ýkon
funkcia displayName () (// prístup k premennej názvu return 'Hi' + '' + name;) Ahoj John
Vo vyššie uvedenom príklade, keď sa greet()
funkcia volá, vráti definíciu funkcie displayName
.
Tu g1
je odkaz na displayName()
funkciu.
Po g1()
zavolaní má stále prístup k greet()
funkcii.
Po spustení console.log(g1)
vráti definíciu funkcie.
Koncept uzavretia existuje pre ďalšie programovacie jazyky, ako sú Python, Swift, Ruby atď.
Pozrime sa na ďalší príklad.
// 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
Vo vyššie uvedenom programe calculate()
berie funkcia jediný argument x
a vráti definíciu multiply()
funkcie. multiply()
Funkcia má jeden argument y
a vracia sa x * y
.
Oboje multiply3
a multiply4
sú uzávery.
calculate()
Funkcia sa nazýva odovzdanie parametra x
. Keď sú multiply3
a multiply4
sú volané, multipy()
funkcia má prístup k odovzdanému x argumentu vonkajšej calculate()
funkcie.
Ochrana osobných údajov
Uzavretie JavaScriptu pomáha pri ochrane osobných údajov programu. Napríklad,
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
Vo vyššie uvedenom príklade sum()
funkcia vráti definíciu increaseSum()
funkcie.
Premenná je vo vnútri increaseSum()
funkcie zväčšená . Hodnotu premennej je však možné zmeniť aj mimo funkcie. V takom prípade a = a + 1;
zmení hodnotu premennej mimo funkcie.
Teraz, ak chcete, aby sa premenná zväčšovala iba vo vnútri funkcie, môžete použiť uzáver. Napríklad,
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
Vo vyššie uvedenom príklade sum()
funkcia nastaví hodnotu a na 0 a vráti increaseSum()
funkciu.
Z dôvodu uzávierky, aj keď sum()
je už vykonaná, increaseSum()
má stále prístup k a môže pri každom volaní pridať 1 do a x()
.
A premenná je pre sum()
funkciu súkromná . To znamená, že k premennej je možné pristupovať iba vo vnútri sum()
funkcie.
Aj keď ho deklarujete a
a použijete, neovplyvní to a
premennú vo vnútri sum()
funkcie.
Poznámka : Uzávery sa spravidla používajú na ochranu osobných údajov.