3

クライアント側でセッションを管理するために使用しようとしているクラスがあります。次のようになります。

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内から呼び出される関数内でデバッグすると、次のようになります。setIntervalthis.timeout = NaN

何かを間違ってスコープしたと思いますか?助けてください?私はJavaScriptを初めて使用します...

4

3 に答える 3

6

関数setIntervalを呼び出すと、期待どおりにthis値が設定されません。呼び出すと正しく設定されますが、関数を渡して別の方法で呼び出すだけでは正しく設定されませんthis.tick() 値を必要なものにバインドする必要がありthisます。

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

これは新しいブラウザで利用できますが、利用可能なシムがあります。

また、あなたはおそらくthis.sessionExpired()それが定義されている場所であるという意味です。戻り値を気にしないreturnので、そこではあまり意味がありません。setInterval

于 2012-07-04T17:35:09.890 に答える
0

タイムアウトを設定したことがありますか?あなたが望むかもしれない

sessionmanager.timeout=0;

クラス定義のどこかに。

于 2012-07-04T17:31:13.380 に答える
0

ES7 Javascriptでは、次のことができます。

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

二重コロン構文::は、へのショートカット.bind(this)です。

于 2015-12-08T00:03:25.263 に答える