1

私はJavaScriptクラスを持っています

function MyClass() {

  MyClass.prototype.fooMethod = function () {
    // some logic goes here...
  }

  MyClass.prototype.fooMethod2 = function () {
    this.fooMethod();
  }
}

次のように呼び出すと、すべてが期待どおりに機能します。

var m = MyClass();
m.fooMethod2();

ただし、このコードを setInterval で呼び出すと、「Uncaught TypeError: Object [object DOMWindow] has no method 'fooMethod'」というエラーが表示されます。

var m = MyClass();
var intervalId = setInterval(m.fooMethod2, 100);

setInverval を使用してメソッドを呼び出す方法はありますか?

4

3 に答える 3

4
setInterval(function() {
  m.fooMethod2();
}, 100);

JavaScript では、コンテキスト ( の値this) はメソッドの呼び出し方法によって設定されます。そのため、関数内にfoo.bar()設定さthisれます。foobar

しかし、他の何かによって実行される関数への参照を返す場合、コンテキストは保持されません。これをチェックしてください:

var callLater = function(fn) {
  setTimeout(function() {
    fn(); // no defined context, `this` will revert to the default: `window` 
  }, 1000);
};
callLater(foo.bar);

このスニペットでは、関数を関数に渡しcallLaterます。しかし、呼び出すときはreceiverfn()なしで実行します。つまり、コンテキストが失われます。

したがって、関数コンテキストが重要な場合はいつでも、オブジェクトのメソッドを明示的に呼び出す無名関数を渡す必要があります。

于 2012-04-12T18:15:53.523 に答える
1
var m = new MyClass();
var intervalId = setInterval(function(){m.fooMethod2();}, 100);

オブジェクトを参照するときは常にnewキーワードを使用してください。そうしないと、予期しないエラーが発生します。

于 2012-04-12T18:16:28.317 に答える
0

コンテキストをパラメーターとして渡します。その後、すべてが完全に機能します。

module.exports = {
   lobby = [],
   init: function () {
      var parent = this;
      setInterval(function () {
        ref.everySecondTick(parent);
      }, 2000);
   },
   everySecondTick: function (parent) {
        console.log(parent.lobby.length);
   }
}
于 2015-12-21T12:34:48.640 に答える