In trying to learn JavaScript closures, I've confused myself a bit.
From what I've gathered over the web, a closure is...
Declaring a function within another function, and that inner function has access to its parent function's variables, even after that parent function has returned.
Here is a small sample of script from a recent project. It allows text in a div to be scrolled up and down by buttons.
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);
}());
Does this example use closures? I know it has functions within functions, but is there a case where the outer variables being preserved is being used?
Am I using them without knowing it?
Thanks
Update
Would this make a closure if I placed this beneath the $(document).ready(init); statement?
return {
scrollDown: scrollDown
};
Could it then be, if I wanted to make the text scroll down from anywhere else in JavaScript, I could do
pageScroll.scrollDown();
I'm going to have a play around on http://www.jsbin.com and report back