Закриття JavaScript

У цьому посібнику ви дізнаєтесь про закриття JavaScript за допомогою прикладів.

Перш ніж дізнатися про закриття, потрібно зрозуміти дві концепції:

  • Вкладена функція
  • Повернення функції

Вкладена функція JavaScript

У JavaScript функція також може містити іншу функцію. Це називається вкладеною функцією. Наприклад,

 // 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()функцію всередині неї.

Повернення функції

У JavaScript ви також можете повернути функцію всередині функції. Наприклад,

 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

Вихідні дані

 функція displayName () (console.log ('Привіт' + '' + ім'я);) Привіт Джон

У наведеній вище програмі greet()функція повертає displayNameвизначення функції.

Тут визначенню функції, що повертається, присвоюється змінна g1. Коли ви друкуєте g1 за допомогою console.log(g1), ви отримаєте визначення функції.

Для виклику функції, що зберігається у змінній g1, ми використовуємо g1()дужки.

Закриття JavaScript

У JavaScript закриття забезпечує доступ до зовнішньої області дії функції зсередини внутрішньої функції, навіть після закриття зовнішньої функції. Наприклад,

 // 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

Вихідні дані

 функція displayName () (// доступ до змінної імені повернення 'Hi' + '' + name;) Привіт Джон

У наведеному вище прикладі при greet()виклику функції вона повертає визначення функції displayName.

Ось g1посилання на displayName()функцію.

Коли g1()його викликають, він все ще має доступ до greet()функції.

Коли ми запускаємо console.log(g1), він повертає визначення функції.

Концепція закриття існує для інших мов програмування, таких як Python, Swift, Ruby тощо.

Давайте подивимось на інший приклад.

 // 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()функція має доступ до переданого аргументу x зовнішньої calculate()функції.

Конфіденційність даних

Закриття JavaScript допомагає забезпечити конфіденційність даних програми. Наприклад,

 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()функція встановлює значення a до 0 і повертає increaseSum()функцію.

Через закриття, хоча sum()воно вже виконане, increaseSum()все ще має доступ до a і може додати 1 до кожного кожного x()виклику.

А змінна є приватною для sum()функції. Це означає, що до змінної можна отримати доступ лише всередині sum()функції.

Навіть якщо ви заявите aта використаєте його, це не вплине на aзмінну всередині sum()функції.

Примітка : Як правило, закриття використовується для конфіденційності даних.

Цікаві статті...