Описание тега closures

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

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

Закрытие 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() в нашем первом примере, а второй набор круглых скобок вызывает возвращаемую функцию.

Ресурсы

Историю замыканий как конструкции языка программирования см. На странице Wikipedia Closure.

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