0

私はjavascriptクラスを作成しました.1秒ごとにメソッドを呼び出したいと思います.これが私のコードです:

var MyClass = Base.extend({
    myMethod: function() {
        setTimeout(function(){
            var mc = new MyClass();
            mc.myMethod();
        }, 1000);
    }
});
var myGlobalClass = new MyClass();

myGlobalClass.myMethod();

new MyClass()実際、このコードは機能しますが、毎回実行する必要があります。
を使用したいと思いmyGlobalClassます。

これは可能ですか?

this.myMethod()あなたがそれを考えた場合、この場合、精度だけでは機能しません。

ご協力いただきありがとうございます

4

4 に答える 4

3

値を参照したい場合はmyGlobalClass、関数から直接参照できます

setTimeout(function(){
  myGlobalClass.myMethod();
}, 1000);

これが機能するのは、名前を解決するときに、Javascript が現在のスコープで定義されているローカルを探すだけではないためです。それらを解決するために、すべての親スコープも調べます。この場合myGlobalClass、グローバル スコープで定義されます。名前解決はsetTimeout関数コールバックで開始され、関数内で見つからず、検索されmyMethod: function() {てそこで見つからず、グローバル スコープが検索され、 Discover が検出されmyGlobalClassます。名前をこの値に解決します

于 2012-07-10T14:59:27.677 に答える
2

setTimeoutメソッドを再帰的に呼び出す代わりに。を使用するsetIntervalと、コードがより明確になります。

    var MyClass = Base.extend({
        myMethod: function() {
           //..
        }
    });
   var myGlobalClass = new MyClass();
   setInterval(myGlobalClass.myMethod, 1000);
于 2012-07-10T15:04:33.073 に答える
1

毎秒アクションを繰り返したい場合、setInterval代わりに? を使用することを考えましたsetTimeoutか? その後myMethod、すべての呼び出しでタイムアウトを初期化する必要はありません。

これを行うことができます:

var MyClass = Base.extend({
    myMethod: function() {
        // do stuff here
    }
});

var myGlobalClass = new MyClass();

setInterval(myGlobalClass.myMethod, 1000);
于 2012-07-10T15:03:05.007 に答える
0

複数のインスタンスがある場合は、関数に名前を付けて再帰的に呼び出します。

myMethod: function myMethod() {
    setTimeout(function(){
        myMethod();
    }, 1000);
}

これは IE8 ではバグがあります。

于 2012-07-10T15:01:20.310 に答える