Javascript setInterval scoping issue

别来无恙 提交于 2019-12-07 12:30:18

问题


I have a class I am attempting to use to manage a session on the client side, it looks like this:

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;

})();

However when I debug inside the tick function that is called from within the setInterval callback I get this.timeout = NaN

I am guessing I scoped something incorrectly? Help please? I am new to javascript...


回答1:


If setInterval calls the function it doesn't set the this value as you may expect. Calling this.tick() does set it correctly, but just passing the function and having it called in another way does not. You have to bind the this value to what you want:

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

This is available on newer browsers but there are shims available.

Also, you probably meant this.sessionExpired(), as that's where it's defined. return doesn't make much sense there since setInterval does not care about the return value.




回答2:


Have you ever set the timeout? You might want

sessionmanager.timeout=0;

somwhere in the class definition.




回答3:


In ES7 Javascript you can do the following:

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

The double colon syntax :: is a shortcut to .bind(this).



来源:https://stackoverflow.com/questions/11333311/javascript-setinterval-scoping-issue

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!