1

我正在尝试使用 jquery 在客户端每秒增加一个值,
这就是这样做的:

<script type="text/javascript">
        $(document).ready(function increment(){
            $("#counter").text(parseInt($("#counter").text())+1);
            setTimeout(increment(),1000)
        })
    </script>

这没有按预期工作,我收到“递归过多”错误。
对此有什么想法吗?

4

4 回答 4

12

尝试

$(document).ready(function () {       
    function increment(){
        $("#counter").text(parseInt($("#counter").text())+1);
        setTimeout(increment,1000);
    };            
    increment();
});

顺便说一句,setInterval()以设定的时间间隔重复调用一个函数,而不是递归调用一个函数setTimeout()

$(document).ready(function () {       
    var interval = setInterval(increment,1000);     
});

function increment(){
    $("#counter").text(parseInt($("#counter").text())+1);            
}  
于 2009-11-24T00:06:51.190 回答
7

increment()是对增量的调用,而不是对它的引用。当您尝试将其设置为再次调用 increment 时,您实际上是在立即再次调用它。如果它曾经返回,它的返回值将被传递给setTimeout,但它永远不会,因为它只是一次又一次地调用自己,直到你得到一个深度递归错误。

解决方案只是删除括号,以便您引用函数增量,而不是调用它。

于 2009-11-24T00:15:50.127 回答
3

setTimeout(increment, 1000)应该是正确的语法,因为您正在传递对函数的引用。

setTimeout()不建议在没有停止条件的情况下递归调用。堆栈最终会爆炸。使用setInterval()应该是安全的。

于 2009-11-24T00:16:44.787 回答
0

一种更简单的方法:“如果'某事'不正确,则在创建后立即调用并在 1000 毫秒间隔内重复的函数”

(function(){
    if (something) {
        doSomething();
    } else {
        setTimeout(arguments.callee, 1000);
    }
})();
于 2016-06-14T16:56:31.867 回答