Замикання (програмування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

В програмуванні, замиканням (англ. closure) називається підпрограма, що виконується в середовищі, що містить одну або більше зв'язаних змінних. Під час виконання, підпрограма має доступ до цих змінних.

Застосування замикань асоціюється з функціональним програмуванням. Такі конструкції, як об'єкти в інших мовах програмування, в функціональному програмуванні можуть моделюватись із допомогою замикань.

В деяких мовах програмування замикання створюється для підпрограм, що визначаються всередині інших підпрограм, і внутрішня підпрограма має доступ до локальних змінних зовнішньої підпрограми. Під час виконання, коли обчислюється зовнішня підпрограма, утворюється замикання, до якого потрапляє код внутрішньої підпрограми, та посилання на ті змінні зовнішньої підпрограми, що використовуються у внутрішній підпрограмі. Посилання на змінні зовнішньої підпрограми залишаються дійсними всередині вкладеної внутрішньої підпрограми до тих пір, поки існує ця вкладена підпрограма, навіть коли зовнішня підпрограма закінчила виконання і вийшла з області видимості. Концепцію замикань було повністю розроблено в 1960-ті роки та реалізовано як особливість мови програмування Scheme. Відтоді було розроблено багато мов програмування з підтримкою замикань.

Приклад реалізації на Lua[ред.ред. код]

function addfunc(x)
    return function(y)        -- Повертає нову функцію без назви, яка додає x до аргументу 
        return x + y          -- Коли ми будемо посилатися на змінну x, що знаходиться поза даною областю й існування якої менше ніж даної  безіменної функції, 
                              --Lua створить замикання                 
    end
end
num_plus = addfunc(2)         -- Тепер num_plus - функція, в якій замість x підставлено 2
print(num_plus(5))            -- В результаті буде виведено 7

Приклад на JavaScript[ред.ред. код]

Функції (зокрема в JS) можна зобразити як спеціальні об'єкти, що включають код, який можна запускати, а також властивості. Кожна функція має властивість [scope], котра відображає оточення на момент створення функції. Якщо ж функцію створено викликом з іншої функції, тоді це відображення старого оточення «перекривається» нової функцією і це називається замиканням.

var myClosure = (function outerFunction() {
  var hidden = 1;
 
  return {
    inc: function innerFunction() {
      return hidden++;
    }
  };
 
}());
 
myClosure.inc();  // повертає 1
myClosure.inc();  // повертає 2
myClosure.inc();  // повертає 3

Коли JS-код працює, локальні змінні зберігаються в scope. В JavaScript локальні змінні можуть лишатись в пам'яті навіть після того, як функція повернула значення.

Створення замикання в JavaScript[ред.ред. код]

Всі функції в JavaScript це замикання, коли задається функція — задається замикання. Так що замикання створюється при визначенні функції. Але треба розуміти різницю між створенням замикання і створенням нового scope-об'єкту: замикання[1] (функція + посилання на поточний ланцюжок scope-об'єктів) створюється при визначенні функції, але новий scope-об'єкт створюється (і використовується для модифікації ланцюжка scope-об'єктів замикання) при виклику функції.

Видалення замикання[ред.ред. код]

Як і будь-який інший об'єкт у JavaScript. Збірник сміття обробляє і видаляє замикання, коли на нього більше немає посилань.

Примітки[ред.ред. код]

  1. Learning Javascript with Object Graphs - How To Node - NodeJS. howtonode.org. Процитовано 2016-04-24.