В этом руководстве вы узнаете о закрытии 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
Вывод
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
Вывод
function displayName () (// доступ к переменной name return '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()
функции.
Переменная a увеличивается внутри 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()
все еще имеет доступ к a и может добавлять 1 к каждому x()
вызову.
И переменная a является частной для sum()
функции. Это означает, что к переменной можно получить доступ только внутри sum()
функции.
Даже если вы объявите a
и используете его, это не повлияет на a
переменную внутри sum()
функции.
Примечание . Как правило, закрытие используется для обеспечения конфиденциальности данных.