10

jquery/javascript の setInterval に関するいくつかの投稿をここや他の場所で確認しましたが、答えについて厄介なことは、ソリューションが機能する理由を学んでいないことです。

考えてください:

匿名関数を使用して、「バニー」を繰り返し出力するアラートを設定できます。

setInterval(function(){
  alert("bunnies")
},3000);

しかし、非匿名関数を使用したい場合は、コーディングする必要があります

setInterval(ホップ、3000);

機能する場所:

function hop(){
    alert("bunnies");
}

コーディングしようとすると:

setInterval(hop(),3000);

ホップは実行されますが、1 回だけです。これがなぜなのかわかりません。これについては、setInterval への参照を渡す必要があることを示唆するさまざまな SO を読みました。これは、最初の形式が setInterval(hop,3000); であることを意味しますか? 参照渡し。もしそうなら、これは説明できますか?

したがって、問題があります。その中で明らかに、パラメータを関数ホップに渡すことができることが望ましいでしょう.....

setInterval(hop("bunnies"),3000);

機能する場所:

function hop(msg){
    alert(msg);
}

これにより、ホップが呼び出されて「バニー」が出力されますが、関数は一度だけ呼び出されます。

したがって、 setInterval によって制御される関数にパラメーターを渡す唯一の方法は、匿名関数内に組み込むことです。

setInterval(function(){
 hop("bunnies")
},3000);

これはパラメーターを渡し、3 秒ごとにバニーを警告するホップの実行を繰り返します (バニーを警告することは非常に重要です)。

したがって、質問:

  1. これは、パラメーターを渡すことができる唯一の構文ですか?
  2. なぜ setInterval(hop("bunnies"),3000); うまくいかない。
4

4 に答える 4

16

setInterval最初のパラメーターとして関数を期待します。あなたが試みるとき:

setInterval(function() {...}, 100);

また

setInterval(funcName, 100);

関数を正しく渡しています。

一方、を試行するとsetInterval(funcName(), 100);、実際には関数が呼び出され、誤った戻り値が渡されます。setInterval

于 2012-10-15T11:51:16.873 に答える
7

なぜうまくいきませsetInterval(hop("bunnies"),3000);ん。

setInterval(hop("bunnies"),3000);hop すぐに呼び出して、その戻り値( undefined) をsetInterval(関数でも文字列でもないため無視される) に渡します。

これは、パラメーターを渡すことができる唯一の構文ですか?

いいえ、しかしそれは最高のサポートです。

他の構文は

 setInterval(hop, 3000, "bunnies")
于 2012-10-15T11:51:59.103 に答える
6

1. パラメータを渡すことができる構文はこれだけですか?

はい、これは私が考えることができる唯一の簡単な方法です...

setInterval(function(){
    hop("bunnies")
},3000);

...しかし、もちろん、多くの間隔を処理する必要がある場合は、次のようなヘルパー関数を作成できます。

function Looper() {
    this.loops = {};
    this.start = function(name, fn, interval, params) {
        this.loops[name] = setInterval(function() {
            fn.apply(null, params);  // maybe bind the function?
        }, interval);
    };
    this.stop = function(name) {
        clearInterval(this.loops[name]);
    };
}

(試してみてください: http://jsfiddle.net/ceHMs/ )

そして、次のように使用します。

function say(name, msg){ console.log(name,':',msg) };
function shout(name, msg){ console.log(name,':',msg.toUpperCase()) };

var looper = new Looper();
looper.start('say', say, 1000, ['clock' 'tick']);
looper.start('shout', shout, 2000, ['clock' 'tack']);
// ... later ...
looper.stop('shout');

しかし、これが本当に必要かどうかを評価する必要があります。


2.なぜうまくいかsetInterval(hop("bunnies"),3000);ない。

これは、setInterval が、指定した数ミリ秒ごとに実行される関数への参照を想定しているためです。

ここで鍵となるのは括弧です。関数名の後に括弧が続くと、指定された関数が実行され、関数の結果が返されます。したがって、setInterval への参照ではなく、関数 hop('bunnies') の戻り値を渡します。関数の参照は、単に関数の名前です。参照された関数を呼び出したい場合は、参照に括弧を追加するだけです。些細な例:

function executeFunction(fn){
    fn();
};

これを知っていれば、ホップ関数を実際に変更して、次のように機能させることができますsetInterval(hop("bunnies"),3000);

function hop(msg){
    return function(){ alert(msg) }
}

しかし、これは setInterval 呼び出しで匿名関数を直接使用するのとほぼ同じです。これで、ホップを呼び出すときにその無名関数を返すだけで、setIntervall の呼び出しが短くなります。

最終的には、個人の好みと特定のユース ケースに帰着します。ほとんどの場合、setInterval で匿名関数を直接使用するアプローチが最も明白であり、他の人にとって最も理解しやすい方法です。

于 2012-10-15T13:10:55.173 に答える
1

関数を呼び出すのではなく、変数として渡す必要があります。

setInterval(ホップ、3000);

最初のパラメータは一定間隔で呼び出す関数なので、 hop() のように入れることで、関数を渡すのではなく呼び出すことができます。引数を渡したい場合は、関数ラッパーを使用します

setInterval(関数(){ホップ(引数)},3000);

于 2012-10-15T11:49:26.337 に答える