Описание тега 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()
в нашем первом примере, а второй набор круглых скобок вызывает возвращаемую функцию.
Ресурсы
- Как работают замыкания в JavaScript?
- В чем разница между "замыканием" и "лямбдой"??
- Что такое "замыкания" в.NET?
Историю замыканий как конструкции языка программирования см. На странице Wikipedia Closure.
В Ruby замыкания называются блоками.