Я использую много замыканий в коде Javascript (это довольно функциональный язык - я шучу, что это Схема с одеждой на Си). Они обеспечивают инкапсуляцию данных, которые являются частными для функции.
Самый вездесущий пример:
var generateId = function() {
var id = 0;
return function() {
return id++;
}
}();
window.alert(generateId());
window.alert(generateId());
Но это привет, мир закрытий Javascript. Однако есть еще много практических применений.
В последнее время на работе мне нужно было написать простую фотогалерею с помощью ползунков. Это делает что-то вроде:
var slide = function() {
var photoSize = ...
var ... // lots of calculations of sizes, distances to scroll, etc
var scroll = function(direction, amout) {
// here we use some of the variables defined just above
// (it will be returned, therefore it is a closure)
};
return {
up: function() { scroll(1, photoSize); },
down: function() { scroll(-1, photoSize); }
}
}();
slide.up();
// actually the line above would have to be associated to some
// event handler to be useful
В этом случае я использовал замыкания, чтобы скрыть всю логику прокрутки вверх и вниз и получить код, который очень семантический: в Javascript "сдвиньте" напишу slide.up()
.