2012-01-02 19 views
2

JavaScriptを使用してタイマーを作成しようとしています。ここに私の機能があります:タイミングイベント(setTimeout)を使用したJavaScript再帰

私は時間(0)を実行すると、ID = "テスト"の部分に何も起こりません。 numは常に0に等しく、bufは、関数が呼び出されるたびに(警告関数から)常に1です。

私はJavaとCに慣れています。これらの言語で動作することはわかっています。私はJavaScriptも値渡し言語であることを知っています。なぜこのタイマーは機能しませんか?また

、私が試した(とNUMに bufをすべてを変更)する場合、なぜ何も起こりませんでした

t=setTimeout("time(num)",1000); 

私はタイマーを作成する他の方法がある知っているが、私は理由を知りたいですこの方法は機能しません。ありがとう。

+0

これは再帰だと思うかもしれませんが、実際はそうではありません。 'time()'が呼び出されると、 'setTimeout()'を呼び出し、後で実行される文字列を渡します。その後、 'time()'が戻り、しばらくしてから 'time()'がタイマーコードによって再び呼び出されます。これは技術的に再帰的ではありません。 'time()'への最初の呼び出しは、2番目の呼び出しが起こる前に終了しています。あなたはちょっと待っています。 – jfriend00

答えて

2

文字列をsetTimeoutに渡すと、時刻が来ると評価されます。この場合、時刻が来ると、buf変数がなくなり、コードはエラーをスローします。

自分で値を置き換える必要があります。

いっそ
t = setTimeout("time(" + buf + ")",1000); 

または、代わりに文字列

t = setTimeout(function() { 
    time(buf); 
}, 1000); 
4

の関数を渡すはsetTimeoutに文字列を渡すことは避けてください。これを行うと、文字列は多かれ少なかれevalとして実行されます。これは多くの理由で悪です。詳細については、this questionを参照してください。

代わりに、匿名関数をsetTimeoutに渡すことを検討してください。これにより、あなたの問題を簡単に解決できます。

t = setTimeout(function() { time(buf); }, 1000); 
関連する問題