ЈаваСцрипт Цлосурес

У овом упутству ћете научити о затварању ЈаваСцрипт-а помоћу примера.

Пре него што научите о затварању, морате да разумете два концепта:

  • Угњежђена функција
  • Враћање функције

ЈаваСцрипт угнежђена функција

У ЈаваСцрипт-у функција може садржати и другу функцију. То се назива угнежђена функција. На пример,

 // 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()функције.

Напомена : Генерално се затварачи користе за приватност података.

Занимљиви Чланци...