2012-02-11 15 views
1

は、私はこれらの二つのことを意味:最初のパラメータにちょうど好奇心から〜誰かが私にsetTimeout()の奇妙なことを説明できますか?奇妙によって

  1. 機能を 引用囲まする必要がある、または他の遅延が(すべては瞬時に を実行する)0に設定されています。
  2. タイムアウト後のすべてに、 という文字列の後に遅延が必要です。そうでない場合は、タイムアウトの終了前に実行されます。

#2の周りに道があるとすれば、これはすばらしいことになりますが、今私はこれに興味があります。

ショートスニペットは、私が話しているかを説明します:上記で

for (var i=0; i<10; i++) setTimeout("addInput('.')",i*500); 
setTimeout('addInput("</br>")',5100); 

、addInput(は「」)引用に囲まれていない限り、遅延は無視され、コードだけで実行されます。また、2行目にタイムアウトを追加しない限り、最初のタイムアウトが終了する前に実行されます。

+0

引用符で囲まれた 'addInput( '。')'は文字列宣言であり、関数呼び出しはありません。 – Gumbo

答えて

5

機能パラメータは、引用符で囲む必要があります。 または遅延が0に設定されている(すべてが即座に実行されます)。

必ずしもそうである必要はありません。

for (var i=0; i<10; i++) { 
    setTimeout(function() { 
     addInput('.'); 
    }, i * 500); 
} 

またはそれと同等の(警告:IEでは動作しません):

実際には、それを解析のオーバーヘッドを避けるために、直接文字列の代わりに関数ポインタを受け取るオーバーロードを使用することをお勧めします
for (var i=0; i<10; i++) { 
    setTimeout(addInput, i * 500, '.'); 
} 

setTimeout過負荷が最も一般的に使用されているものである。

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]); 
+1

IEの 'setTimeout'(呼び出し時にコールバックに渡される)に余分な引数を渡すことはできません[https://developer.mozilla.org/ja/DOM/window.setTimeout]。 – josh3736

+0

@ josh3736、これを指摘してくれてありがとう。私はこの貴重な情報を含むように私の答えを更新しました。 –

+0

非常に興味深い、ありがとう!あなたは私の質問の第2部分にも答えを持っていますか? - または、提案されているように関数を適切に使用して解決するでしょうか? –

4

setTimeoutは関数参照を受け取ります。つまり、関数を実行した結果ではなく、関数名または無名関数を渡す必要があります。

だから、この作品:

setTimeout(fn, 1000); 

しかし、これはしません:

setTimeout(fn(), 1000); 

2番目の例では、通常、何をされていないすぐにfn()を実行し、setTimeout()にその関数からの戻り値を渡します欲しい(あなたは遅れを取らない)。

あなたの関数にパラメータを渡す必要がある場合は、あなたがsetTimeoutをパラメータなしであなたの関数を呼び出しますので、このようなコンテナ機能でそれをラップする必要があります:最初の

setTimeout(function() {addInput('.')}, i*500); 
0
  1. これは、まずファンクションを呼び出してから、戻り値をsetTimeoutメソッドに送信するためです。関数名だけを使用することも、パラメータを送信する必要がある場合は、無名関数を作成することもできます。

    setTimeout(function(){addInput( '。')}、i * 500);

  2. setTimeoutメソッドはコードを遅延させず、タイマーのコールバックにコードを挿入します。 setTimeoutコールに続くコードはすぐに続きます。

関連する問題