1

このコードの場合:

    var myObj = {
    callMeMaybe: function () {
        var myRef = this;
        var val = setTimeout(function () { 
            console.log('Time is running out!'); 
            myRef.callMeMaybe();
        }, 1000);
    }
};

myObj.callMeMaybe();
myObj = null;

myObj.callMeMaybe() を呼び出してから myObj = null を呼び出すとします。callMeMaybe(); の呼び出しはまだキャンセルできません。とにかくこれを解決するには?ありがとう。

4

3 に答える 3

0

する必要がありwindow.clearTimeoutますval

    var myObj = {
    callMeMaybe: function () {
        var myRef = this;
        this.val = setTimeout(function () { // made val visible outside
            console.log('Time is running out!'); 
            myRef.callMeMaybe();
        }, 1000);
    }
};

myObj.callMeMaybe();

window.clearTimeout( myObj.val );
myObj = null;
于 2012-11-07T15:42:34.017 に答える
0

clearTimeout() メソッドは、setTimeout() メソッドで設定されたタイマーをクリアします。setTimeout() によって返される ID 値は、clearTimeout() メソッドのパラメーターとして使用されます。

clearTimeout(id_of_settimeout);

Number.MAX_VALUEは1.7976931348623157e+308VALUE です

この質問は、clearTimeout ループ 1.7976931348623157e+308VALUE 回で解決できると思います。

時間がかかりますか?

または、最大 id_of_settimeout を取得できます

max_id_of_settimeout = setTimeout(null,0);

その後、ゼロにループバックします

for (var i = max_id_of_settimeout;i>=0;i--){clearTimeout(i);}

私の意見です。

于 2012-11-07T15:56:11.187 に答える
-1

callMeMaybeプロパティを新しい関数で上書きするnullか、TypeError を気にしない場合。

myObj.callMeMaybe();
myObj.callMeMaybe = function(){};

から非同期呼び出しが行われるsetTimeoutと、空の関数が呼び出されます。


関数を上書きしたくない場合は、オブジェクトにフラグを設定してください。

var myObj = {
    callMeMaybe: function () {
        var myRef = this;
        var val = setTimeout(function () { 
            console.log('Time is running out!'); 
            if (!myRef.prevent)
                myRef.callMeMaybe();
        }, 1000);
    }
};

myObj.callMeMaybe();
myObj.prevent = true; // will prevent the .callMeMaybe() in the setTimeout

ただし、明確にするために、クロージャー参照自体をクリアすることはできません。オブジェクトは参照型で、JavaScript は値渡しです。

これは、次のことを意味します。

var myRef = this;

...オブジェクト参照のコピーを作成しました。はローカル変数なのでmyRef、外部から触れることはできません。あなたができる最善の方法は、参照されているオブジェクトを操作するか、myRef変数を外側のスコープで使用できるようにすることです。

...そして反対票を無視します。彼らは JavaScript の仕組みを理解していません。

于 2012-11-07T15:42:27.150 に答える