5

このコードを使用して、コードの一部をラップしています。このように使用されています。

var delay = (function() {
    // SET TIMER
    var timer = 0;
    // RETURN SET TIMEOUT FUNCTION
    return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
})();​

私はこう呼んでいますが、

delay(function() {
     .......
}, 1000);

そして、それは1000ミリ秒遅れますが、何が起こっているのかわかりません:)

4

3 に答える 3

7

遅延は、別の関数を返す関数です。タイマー変数は遅延関数のクロージャ内にあるため、戻り関数から引き続きアクセスできます。関数。このように書くこともできます

var delay;
var timer = 0;
delay = function(callback, ms) {
    clearTimeOut(timer);
    timer = setTimeout(callback, ms);
}

現在発生している問題は、delay を 2 回呼び出すとタイマー変数が上書きされるため、2 回目の遅延がタイマー変数を上書きすることです。私はこれをテストしましたが、あなたの機能も壊れているようです:

var delay = function(){
// SET TIMER
    var timer = 0;
// RETURN SET TIMEOUT FUNCTION
    return function(callback, ms){
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
};

delay()(function(){console.log("hello1");}, 5000);
delay()(function(){console.log("hello2");}, 5000);

コードが同じことを行う場合、最初のものがタイマー変数を上書きするため、hello2 のみがトレースされます。

2 番目の遅延が最初の遅延を止めるという意図がない限り、別のアプローチを使用する必要があります。

于 2012-04-08T22:44:10.937 に答える
2

このコードが最初に行うことは、この関数を実行することです (()投稿したコードの最後にある に感謝します)。

function() {
    // SET TIMER
    var timer = 0;
    // RETURN SET TIMEOUT FUNCTION
    return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
}​

結果を に保存しdelayます。この関数を実行するとtimer、ローカル カウンターとして機能するローカル変数を使用してクロージャーが作成されます。次に、関数は内部関数を返します。

function(callback, ms) {
   clearTimeout(timer);
   timer = setTimeout(callback, ms);
}

クロージャーであるため、この内部関数はtimer変数にアクセスできます。他の外部コードはアクセスできませんtimertimerこのメソッドは、複数の変数を気にすることなく、複数のタイマーを一度に実行できるようにするために使用されます。

次のように想像してください。ローカル変数 にアクセスできるdelay関数 ( ) が含まれています。外部コードに関する限り、変数は見えません。を含む関数のみがアクセスできます。function(callback, ms) {...timertimerdelay

次に、 を呼び出してその内部関数を呼び出しdelay(callback, timeout)ます。

于 2012-04-08T22:39:34.133 に答える
0

コードの最初の部分では、変数を遅延させ、if を関数の戻り値に割り当てます。これは、次の関数を返します。

return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    }

したがって、これは実際には遅延変数です。nwだから、あなたがそれを好きなように呼ぶとき..

delay(function() {
     .......
}, 1000);

この wud は期待どおりに動作します。最後に変数を代入していることに
も注意して()ください。JavaScript では、関数が検出delayされるとすぐに関数を実行することを意味します。コードの最初の部分が実行され、delay変数には関数が割り当てられます..コードの2番目の部分で呼び出します

于 2012-04-08T22:39:49.260 に答える