Закрытие - это первоклассная функция, которая ссылается на (закрывает) переменные из области, в которой она была определена. Если закрытие все еще существует после того, как его определяющая область действия заканчивается, переменные, которые она закрывает, будут продолжать существовать.

Закрытие - это функция первого класса, которая ссылается на (закрывает) переменные из области, в которой оно было определено. Если замыкание все еще существует после того, как его определяющая область действия заканчивается, переменные, над которыми оно закрывается, также будут продолжать существовать.

Закрытие JavaScript

Базовый пример закрытия в JavaScript может быть показан со счетчиком:

function increment () {
    var count = 0;
    return function () { // returning function
         count++; // increment the count
         return count;
    };
}

var foo = increment(); // foo is now a closure function, where count = 0
foo(); // calls the closure which yields 1

Причина, по которой increment считается закрытием, заключается в том, что это локальная переменная. В этом случае count сохраняется при назначении переменной foo. Это постоянство происходит, потому что контекст foo берется из приращения, когда он объявлен.

Ключевым моментом закрытия является то, что среда функции "закрыта" для хост-объекта.

var bar = increment(); // bar is now another closure function, with count initialized to 0
bar(); // calls the closure which yields 1, not 2.

JQuery закрытия

Более практичным примером замыкания является библиотека jQuery. JQuery сам по себе является одним большим закрытием. Это объявлено так:

var jQuery = (function() { // Here is the closure
    // Define a local copy of jQuery
    var jQuery = function( selector, context ) {
        // The jQuery object is actually just the init constructor 'enhanced'.
        return new jQuery.fn.init( selector, context, rootjQuery );
    },
    ...
}) ( window );

Давайте посмотрим глубже на это. Закрытие jQuery на самом деле является выражением немедленного вызова функции или замыканием, которое вызывается немедленно. Давайте возьмем наш оригинальный пример приращения и представим его в форме, которую использует jQuery:

var foo = (function () {
    var count = 0;
    return function () {
        count++; // Increment the count
        return count;
    };
}) ();

foo(); // Yields 1

На первый взгляд, это выглядит несколько иначе, чем в нашем оригинальном примере, но взгляните по-другому. Разница лишь в том, что этот пример заключен в скобки. (function() {...})(); , Эти скобки возвращают результат того, что внутри них.

Первые круглые скобки возвращают функцию с count = 0. Это то же самое, что вызывать increment() в нашем первом примере, а второй набор скобок вызывает возвращаемую функцию.

Ресурсы

Историю замыканий как конструкции языка программирования смотрите на странице Закрытие Википедии.

В Ruby замыкания называются блоками.