模块内的 Javascript 作用域问题

标签 javascript

当像下面的代码一样声明时,在 updateSession() 内访问时 $sessionTimeLeft 是未定义的。但是当我将 $sessionTimeLeft 声明和赋值移到 initiate() 内时,我得到了正确的 jQuery 对象。我认为由于闭包,当在 initiate() 中声明时我可以访问 $sessionTimeLeft 。但为什么 $sessionTimeLeft 超出了我的原始代码的范围?

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);

最佳答案

这里的问题是,当您尝试访问时,#dcSessionTimeLeft 可能尚未加载。因此,确保加载它的一种方法是将代码包装在 document.ready 中。 :

$(function() {
  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);
});

关于模块内的 Javascript 作用域问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38647029/

相关文章:

javascript - AngularJS 无法获取下拉菜单的选定索引

javascript - Protractor - 如何处理大量动画的网站?

c# - 在 ASP.NET 中链接两个表单

javascript - 我无法在 Phaser 3 中加载 PC 上的图像

javascript - 如何执行某些功能

javascript - 如何获取 JavaScript 函数内的函数名称?

javascript - 编写由许多链接和打开/关闭 div 组成的 jQuery 代码的更好方法

javascript - 如何获取浏览器左右两侧的距离?

javascript - JQuery Ajax 池

javascript - 发送 jqueryAjax 请求时出现错误