2016-12-20 23 views
-1

私はJavaScriptのforループに遅延を設定しようとしています。私はそれがiを記録し、遅れていて、次にiのようにログを記録したいと思います。私の質問は、なぜ次のコードは以下から分かるように関数が関数を返した、仕事んされています。期待通りを動作しませforループ内のsetTimeout

for (var i = 1; i <= 5; i++) { 
     var tick = function(i) { 
      return function() { 
       console.log(i); 
      } 
     }; 
     setTimeout(tick(i), 500 * i); 
    } 

し、次のコード

for (var i = 1; i <= 5; i++) { 
    var tick = function(i) { 
     return console.log(i); 

    }; 
    setTimeout(tick(i), 500 * i); 
} 

forループのすべての値を一度に出力します。誰かがなぜこれが起こるか説明してもらえますか?コードの両方の部品で

+2

setTimeoutの最初の引数は、関数でなければなりません。関数を呼び出す結果ではありません。ただし、firs関数の呼び出し結果は関数そのものです –

+0

'let'に' var'をスイッチします – Endless

+0

@Endless - 2番目のコード例はタイムアウト後に 'undefined'を呼び出そうとします –

答えて

3

tick(i)

各ループ内で直ちに実行される差は、最初の例では、ダニ(i)はsetTimeoutメソッドによって呼び出される関数を返し、へ出力すること、ですconsole

第2の例では、console.logがすぐに呼び出され、未定義が返され、与えられた引数が関数(または評価される文字列)でないため、タイムアウトが発生しても何もしません