Эта статья или раздел нуждается в переработке. |
Замыкание (англ. closure) в программировании — функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами. Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своей области видимости.
Замыкание, так же как и экземпляр объекта, есть способ представления функциональности и данных, связанных и упакованных вместе.
Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. Синтаксически это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции.
В случае замыкания ссылки на переменные внешней функции действительны внутри вложенной функции до тех пор, пока работает вложенная функция, даже если внешняя функция закончила работу, и переменные вышли из области видимости.[1]
Замыкание связывает код функции с её лексическим окружением (местом, в котором она определена в коде). Лексические переменные замыкания отличаются от глобальных переменных тем, что они не занимают глобальное пространство имён. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам.
Пример работы замыканий на Scheme:
(define (make-adder n) ; возвращает замкнутое лямбда-выражение
(lambda (x) ; в котором x - связанная переменная,
(+ x n))) ; а n - свободная (захваченная из внешнего контекста)
(define add1 (make-adder 1)) ; делаем процедуру для прибавления 1
(add1 10) ; возвращает 11
(define sub1 (make-adder -1)); делаем процедуру для вычитания 1
(sub1 10) ; возвращает 9
Пример работы на JavaScript:[2]
'use strict';
const add = x => y => {
const z = x + y;
console.log(x + '+' + y + '=' + z); // 3+6=9
return z;
};
const res = add(3)(6); // 9
console.log(res);
Пример рекурсивного замыкания на JavaScript:[2]
'use strict';
const add = x => y => {
const z = x + y;
console.log(x + '+' + y + '=' + z);
return add(z);
};
const res = add(1)(4)(6)(9);
console.log(res);
/* 1+4=5
5+6=11
11+9=20
[Function]*/
Когда JS-код работает — локальные переменные хранятся в scope. В JavaScript локальные переменные могут оставаться в памяти даже после того, как функция вернула значение.
Замыкание создается в JavaScript Все функции в JavaScript это замыкания, когда задается функция — задается замыкание. Так что замыкание создается при определении функции. Но нужно понимать разницу между созданием замыкания и созданием нового scope-объекта: замыкание (функция + ссылка на текущую цепочку scope-объектов) создается при определении функции, но новый scope-объект создается (и используется для модификации цепочки scope-объектов замыкания) при вызове функции.
Для улучшения этой статьи желательно: |
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .