JavaScript的setInterval的范围界定问题(Javascript setInterv

2019-09-19 02:15发布

我有一个类,我试图用来管理客户端的会话,它看起来像这样:

var sessionmanager;

sessionmanager = (function() {

  sessionmanager.name = 'sessionmanager';

  function sessionmanager(timeout, action) {
    if (action != null) {
      this.action = action;
    } else {
      this.action = null;
    }
    if (timeout != null) {
      this.timeout = timeout * 60;
    } else {
      this.timeout = 0;
    }
  }

  sessionmanager.prototype.run = function() {
    return window.setInterval(this.tick, 1000);
  };

  sessionmanager.prototype.sessionExpired = function() {
    if (this.action != null) {
      window.navigate("timeout.asp");
    }
  };

  sessionmanager.prototype.setTimeout = function(timeout) {
    return this.timeout = timeout;
  };

  sessionmanager.prototype.tick = function() {
    this.timeout -= 1;
    if (this.timeout < 1) {
      return sessionExpired();
    }
  };

  return sessionmanager;

})();

然而,当我调试里面tick即从内部调用函数setInterval回调,我得到this.timeout = NaN

我猜我作用域什么错误? 请帮助? 我是新来的JavaScript ...

Answer 1:

如果setInterval调用函数不设置this ,你可能期望的价值。 调用this.tick() 正确设置它,但只是路过的功能,并有另一种说法叫没有。 你必须绑定this值你想要什么:

setInterval(this.tick.bind(this), 1000);

这是可在新的浏览器,但也有垫片。

此外,你可能是指this.sessionExpired()因为这是它的定义在哪里。 return没有太大的意义,因为有setInterval不关心的返回值。



Answer 2:

你有没有设置超时? 你可能想要

sessionmanager.timeout=0;

somwhere类定义。



Answer 3:

在ES7的Javascript,你可以做到以下几点:

window.setInterval(::this.tick, 1000);

双冒号语法::是一条捷径.bind(this)



文章来源: Javascript setInterval scoping issue