6

私は善良な市民になろうとしており、可能な限りグローバルな範囲から離れようとしています. グローバル スコープにない setTimeout 変数にアクセスする方法はありますか?

では、この例では、誰かが「タイマー」をキャンセルするにはどうすればよいでしょうか?

myObject.timedAction = (function(){
    var timer;
        return function(){
            // do stuff

            // then wait & repeat       
            timer = setTimeout(myObject.timedAction,1000);
        };
})();

私はclearTimeout(myObject.timedAction.timer,1000);(成功せずに)試しましたが、他に何を試すべきかわかりません。

4

3 に答える 3

4

への参照がない限りtimer、それはできません。これは、スコープ内の変数として宣言しているためです。次のようなことができます:

myObject.timedAction = (function(){
    return function(){
        // do stuff

        // then wait & repeat       
        myObject.timedAction.timer = setTimeout(myObject.timedAction,1000);
    };
})();

clearTimeout(myObject.timedAction.timer);

上記のコードでは、1 つのタイマーしか許可されないことに注意してください。複数のタイマーへの参照が必要な場合は、調整する必要があります。

于 2011-05-08T01:20:42.573 に答える
3

重要なのは、内部変数はプライベートであり、外の世界にはアクセスできないということです。したがって、アプローチを少し変更する必要があります。

myObject.timedAction = (function(){
    var timer;
    var result = function(){
        // do stuff
        // then wait & repeat       
        timer = setTimeout(myObject.timedAction,1000);
    };

    result.cancel = function() {
        clearTimeout(timer);
    };

    return result;
})();

myObject.timedAction();       // start it
myObject.timedAction.cancel() // end it

そのため、タイマーはクロージャーの内側からのみアクセスできるようになりました。はい、JSは素晴らしいので、関数にメソッドを追加できます。

于 2011-05-08T01:25:43.480 に答える
1

オブジェクトのプロパティにタイマーハンドルを配置します。

myObject.timedAction = function(){
  // do stuff
  // then wait & repeat
  this.timer = window.setTimeout(function(){ myObject.timedAction(); },1000);
};

タイマーからの呼び出しを関数でラップする必要があることに注意してください。そうしないと、グローバル関数としてではなくオブジェクトのメソッドとして呼び出されます。そうしないと、を使用してオブジェクトにアクセスできなくなりますthis

これで、次を使用してタイマーを停止できます。

window.clearTimeout(myObject.timer);
于 2011-05-08T01:27:43.347 に答える