У овом упутству ћете научити о затварању ЈаваСцрипт-а помоћу примера.
Пре него што научите о затварању, морате да разумете два концепта:
- Угњежђена функција
- Враћање функције
ЈаваСцрипт угнежђена функција
У ЈаваСцрипт-у функција може садржати и другу функцију. То се назива угнежђена функција. На пример,
// 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()
функције.
Напомена : Генерално се затварачи користе за приватност података.