Пытаясь выучить замыкания в JavaScript, я немного запутался.
Из того, что я собрал в сети, закрытие ...
Объявление функции в другой функции, и эта внутренняя функция имеет доступ к переменным своей родительской функции, даже после того, как эта родительская функция вернула .
Вот небольшой пример скрипта из недавнего проекта. Позволяет кнопкам прокручивать текст в элементе div вверх и вниз.
var pageScroll = (function() {
var $page,
$next,
$prev,
canScroll = true,
textHeight,
scrollHeight;
var init = function() {
$page = $('#secondary-page');
// reset text
$page.scrollTop(0);
textHeight = $page.outerHeight();
scrollHeight = $page.attr('scrollHeight');
if (textHeight === scrollHeight) { // not enough text to scroll
return false;
};
$page.after('<div id="page-controls"><button id="page-prev">prev</button><button id="page-next">next</button></div>');
$next = $('#page-next');
$prev = $('#page-prev');
$prev.hide();
$next.click(scrollDown);
$prev.click(scrollUp);
};
var scrollDown = function() {
if ( ! canScroll) return;
canScroll = false;
var scrollTop = $page.scrollTop();
$prev.fadeIn(500);
if (scrollTop == textHeight) { // can we scroll any lower?
$next.fadeOut(500);
}
$page.animate({ scrollTop: '+=' + textHeight + 'px'}, 500, function() {
canScroll = true;
});
};
var scrollUp = function() {
$next.fadeIn(500);
$prev.fadeOut(500);
$page.animate({ scrollTop: 0}, 500);
};
$(document).ready(init);
}());
Использует ли этот пример замыкания? Я знаю, что у него есть функции внутри функций, но есть ли случай, когда сохраняются внешние переменные?
Я использую их, не зная об этом?
Спасибо
Обновление
Сделало бы это закрытие, если бы я поместил это под оператором $(document).ready(init);
?
return {
scrollDown: scrollDown
};
Может ли быть так, что если бы я хотел сделать прокрутку текста вниз из любого другого места в JavaScript, я мог бы сделать
pageScroll.scrollDown();
Еще одно обновление
Ух ты, похоже, это сработало! Вот код на JSbin . Обратите внимание, что в этом примере прокрутка страницы не совсем работает (кажется, что она не доходит до конца текста), но это нормально :). Бонусные баллы для всех, кто может сказать мне, почему он не прокручивается вниз. 1031 *