У цьому посібнику ви дізнаєтесь про закриття 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()
функції.
Примітка : Як правило, закриття використовується для конфіденційності даних.