2012-01-04 7 views
16

私は4秒ごとに自分の関数を呼び出そうとしていますので、数値を増やします。何らかの理由で私は間違いを続けています。setTimeoutコール中に最大コールスタックサイズが超過

<html> 
<head> 
<title>Recycle Counter</title> 
<script type="text/javascript"> 
    function rand(from, to) 
    { 
     return Math.floor(Math.random() * (to - from + 1) + from); // Generates random number 
    } 

    var num = rand(10000, 100000); 

    function getNum() // Gets triggered by page load so innerHTML works 
    { 
     document.getElementById('counter').innerHTML = num + 7; 
     setTimeOut(getNum(), 4000); 
    } 
</script> 
</head> 
<body onload="getNum()"> 
    <div id="counter"> 

    </div> 
</body> 
</html> 
+1

すべきですか? –

答えて

32

getNumの内部では、あなたが直接スタックが排出させ、getNum機能を呼び出している:ここに私のコードです。 setTimeoutのドキュメントを

function getNum() // Gets triggered by page load so innerHTML works 
{ 
    num += 7;  // Increase and assign variable 
    document.getElementById('counter').innerHTML = num; 
    setTimeout(getNum, 4000); // <-- The correct way 
} 

リンク:関数参照getNum持つ関数呼び出しgetNum()を交換してください。

+1

ハ!ええ、それはエラーを取り除いたが、それが増加を開始することはありませんでした。今では、感謝しています! –

+1

今度はそれが増えます。 'num'変数を代入する必要があります。 –

0

あなたはsetTimeoutを内部に構文間違いがあり

setTimeOut(getNum(), 4000);(そして、それはrecursievlyそれを行います)

正しい方法はsetTimeOut('getNum()', 4000);またはsetTimeOut(function() { getNum(); }, 4000);

+5

引用符で囲むことは***正しい方法ではありません。 – SomeKittens

8

問題であり、それを実行するためのコードを返します期待getNumを呼び出しますsetTimeoutへのあなたの呼び出しは、実行のためにスケジューリングする代わりにgetNumを呼び出しています。これにより、無限の再帰とスタックのオーバーフローが発生します。試してみてください代わりに、次の

setTimeout(getNum, 4000); 
+9

+1:はい、それは最も確実に彼を導く...スタックオーバーフロー! :] – trejder

3

setTimeOutあなたの関数getNum()は無限再帰ループの右に動けなくなることを実感setTimeout

関連する問題