2012-01-04 39 views
16

Tôi đang cố gắng gọi hàm của tôi sau mỗi 4 giây để nó sẽ tăng số trực tiếp. Vì một lý do nào đó, tôi tiếp tục gặp lỗi. Dưới đây là mã của tôi:Kích thước ngăn xếp cuộc gọi tối đa đã vượt quá trong một cuộc gọi 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

Bạn nhận ra rằng chức năng getNum của bạn() sẽ gặp khó khăn trong một vô tận đệ quy loop phải không? –

Trả lời

32

Bên getNum, bạn đang trực tiếp gọi các getNum chức năng, làm cho chồng để xả. Thay thế chức năng gọi getNum() với tài liệu tham khảo chức năng getNum:

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 
} 

Liên kết đến tài liệu của setTimeout.

+1

Ha! vâng mà đã thoát khỏi lỗi nhưng điều đó không làm cho nó bắt đầu tăng lên. Ima giữ nó cảm ơn! –

+1

Bây giờ nó tăng lên. Bạn phải gán biến 'num'. –

0

Bạn có sai lầm cú pháp bên trong setTimeout

setTimeOut(getNum(), 4000); sẽ gọi getNum mong đợi nó sẽ trả về một mã để thực hiện (Và nó sẽ làm điều đó recursievly)

cách Đúng là setTimeOut('getNum()', 4000); hoặc setTimeOut(function() { getNum(); }, 4000);

+5

Đặt nó trong dấu ngoặc kép là *** không *** đúng cách. – SomeKittens

8

Vấn đề là cuộc gọi của bạn tới số setTimeout đang gọi getNum thay vì lập lịch để thực hiện. Điều này dẫn đến đệ quy vô hạn và tràn ngăn xếp. Thử cách sau thay vì

setTimeout(getNum, 4000); 
+9

+1: Vâng, nó chắc chắn dẫn anh ta đến ... Stack Overflow! :] – trejder

3

setTimeOut nên setTimeout

Các vấn đề liên quan