When declared like in the code below, $sessionTimeLeft is undefined when being accessed inside updateSession(). But when I moved $sessionTimeLeft declaration and assignment inside initiate(), I get the correct jQuery object. I think I can access $sessionTimeLeft when it is declared inside initiate() because of closure. But why is $sessionTimeLeft out of scope on my original code?
var session = (function SessionManager() {
var timeLeftInMs;
var timeLeftInMin;
var delay; // in ms
var $sessionTimeLeft = $('#dcSessionTimeLeft');
/* Set up the module by setting the timeout and delay time. */
function initiate(_timeout, _delay) {
timeLeftInMin = _timeout;
timeLeftInMs = timeLeftInMin * 60 * 1000;
delay = _delay; // delay in ms
setInterval(updateSession, delay);
}
function updateSession() {
timeLeftInMs -= delay;
timeLeftInMin = timeLeftInMs / 60000; // convert ms to min.
$sessionTimeLeft.text(timeLeftInMin);
}
var publicAPI = {
initiate: initiate
};
return publicAPI;
})();
session.initiate(30,1000);
session.initiate(30, 1000)#dcSessionTimeLeftloaded when you assign it to$sessionTimeLeft?dcSessionTimeLeftdoesn't exist when the module is created