0

アクセスできない/変更できないこのコードがあるとしましょう。

function f() {
// bad tasks
}
setInterval(f, 10000);

関数 f を変更したいので、下にこのように書きます。

window.f = function(){
// good tasks
}

しかし、その中にある元の関数f()bad tasksまだ 10 秒ごとに実行されています。渡された関数setIntervalがまだ元の関数を指しているようです。どうすれば止められますか?

4

3 に答える 3

1

あなたの仮定は正しいです: interval は元の への参照を保持しますf

元のスクリプトを編集せずにこれを変更する方法はありません。できることは、サイトのすべてのインターバルをクリアして、別のインターバルを開始することだけです。これについては、 https://stackoverflow.com/a/8860203/27862を参照してください。

于 2012-04-18T07:31:42.040 に答える
0

一方通行:

function f() {
    //bad tasks
}

setInterval(function() { f(); }, 10000);

window.f = function() {
    //good tasks
}

そのため、タイマーは渡された古いf()ではなく、現時点でfという名前の関数を呼び出します。

他の方法:

function f() {
    //bad tasks
}

var interval = setInterval(f, 10000);

function g() {
    //good tasks
}

clearInterval(interval);
setInterval(g, 10000);
于 2012-04-18T06:50:35.200 に答える
0

を使用せずsetIntervalsetTimeout代わりに使用してください。必要なコントロールを提供します。

function f() {
 // bad tasks
 fTimeout = setTimeout(f,1000);
}
//start
var fTimeout = setTimeout(f,1000);

今、何か悪いことが起こっていて、書き直したい場合f:

clearTimeout(fTimeout);
window.f = function() { 
            /* good stuff */ 
            fTimeout = setTimeout(f,1000);
           }
fTimeout = setTimeout(f,1000);

こちらもご覧ください

于 2012-04-18T07:49:58.217 に答える