У овом упутству ћете научити о затварању ЈаваСцрипт-а помоћу примера.
Пре него што научите о затварању, морате да разумете два концепта:
- Угњежђена функција
- Враћање функције
ЈаваСцрипт угнежђена функција
У ЈаваСцрипт-у функција може садржати и другу функцију. То се назива угнежђена функција. На пример,
// 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
У горњем програму, greet()функција садржи displayName()функцију унутар ње.
Враћање функције
У ЈаваСцрипт-у такође можете да вратите функцију унутар функције. На пример,
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
Оутпут
функција дисплаиНаме () (цонсоле.лог ('Хи' + '' + наме);) Здраво Јохн
У горњем програму greet()функција враћа displayNameдефиницију функције.
Овде је враћена дефиниција функције додељена променљивој г1. Када одштампате г1 помоћу console.log(g1), добићете дефиницију функције.
Да бисмо позвали функцију сачувану у променљивој г1, користимо је g1()у заградама.
ЈаваСцрипт Цлосурес
У ЈаваСцрипт-у, затварање омогућава приступ спољном опсегу функције из унутрашње функције, чак и након што се спољна функција затвори. На пример,
// 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
Оутпут
функција дисплаиНаме () (// приступ променљивој имена ретурн 'Хи' + '' + наме;) Здраво Јохн
У горњем примеру, када је greet()функција позвана, она враћа дефиницију функције displayName.
Ево g1референце за displayName()функцију.
Када g1()је позван, и даље има приступ greet()функцији.
Када покренемо console.log(g1), враћа дефиницију функције.
Концепт затварања постоји за друге програмске језике као што су Питхон, Свифт, Руби итд.
Погледајмо још један пример.
// 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
У горњем програму, calculate()функција узима један аргумент xи враћа дефиницију multiply()функције функције. multiply()Функција узима један аргумент yи враћа x * y.
Оба multiply3и multiply4су затварања.
calculate()Функција се зове пролази параметар x. Када multiply3и multiply4називају је multipy()функција има приступ положеном к аргумент спољашњег calculate()функције.
Приватност података
Затварање ЈаваСцрипт-а помаже у приватности података програма. На пример,
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
У горњем примеру, sum()функција враћа дефиницију increaseSum()функције функције.
Променљива је повећана унутар increaseSum()функције. Међутим, вредност променљиве може се променити и изван функције. У овом случају, a = a + 1;мења вредност променљиве изван функције.
Сада, ако желите да се променљива повећава само унутар функције, можете користити затварање. На пример,
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
У горњем примеру, sum()функција поставља вредност а на 0 и враћа increaseSum()функцију.
Због затварања, иако sum()је већ извршено, increaseSum()и даље има приступ а и може додати 1 сваком x()позиву.
А променљива је приватна за sum()функцију. То значи да се променљивој може приступити само унутар sum()функције.
Чак и ако га пријавите aи користите, то не утиче на aпроменљиву унутар sum()функције.
Напомена : Генерално се затварачи користе за приватност података.








