2016-08-09 10 views
2

を実行したsetTimeout setTimeout(doIt(i),2000);は即座Javascriptが即座にこのコードを実行している

なぜにスクリプトとして、しかし、私は、それを実行する前に2ミリ秒待機する必要がありますか?

<script type="text/javascript"> 
    var colors= ["red","pink","green"]; 
    function doIt(i){ 
     i++ 
     console.log(i); 
     console.log("didIt"); 
     $('body').append("<style>body{background:"+i+";}</style>"); 
     if(i==2){ 
     } 
     else{ 
      test(i); 
     } 

    } 

    function test(i){ 
     setTimeout(doIt(i),2000); 
    } 
    test(0); 
</script> 
+0

'setTimeout'最初の引数は参照であります関数へ – zerkms

+0

Differenc関数式と関数呼び出しの間のe:かっこ1つは関数であり、もう1つは関数によって返される値です。 –

+0

チュートリアルはこちら:http://www.jquerybyexample.net/2014/11/javascript-settimeout-executes-function-immediately.html – Jaime

答えて

4

これはよくある間違いです。これにあなたのコードを変更します。あなたが直接doItメソッドを呼び出すだけではなくdoIt(i)を書き込むことによってsetTimeoutコールバックへの参照を渡した

function test(i){ 
    setTimeout(function() { 
     doIt(i); 
    }, 2000); 
} 

bind()方法を使用して直接書き込むのもう一つの方法:

function test(i) { 
    setTimeout(doIt.bind(null, i), 2000); 
} 

それはすべてここに与えられています:

  1. How can I pass a parameter to a setTimeout() callback?
  2. Calling functions with setTimeout()
関連する問題