7

我使用了这段代码(后面是填充“tcap”文本区域的 xmlhttprequest):

st=setTimeout(checkme(),4000)

哪里checkme()是:

function checkme() {
    if (typeof (st) != 'undefined') clearTimeout(st)
    if (document.getElementById("tcap").innerHTML.length > 0) {
        document.getElementById('waitmsg').style.display = 'none'
    } else {
        st = setTimeout(checkme(), 1000)
    }
}  

如果我运行它,它会冻结 Firefox 19而没有错误消息。但是,如果我将第一个参数(在代码和 checkme() 函数中)替换为:

st=setTimeout(function(){checkme()},4000)

它工作正常。所以我的问题是:checkme()使用或不使用 anon 函数调用函数有什么区别?为什么在第一种情况下它会冻结 Firefox?

谢谢

4

4 回答 4

12

您需要删除括号

st=setTimeout(checkme(),4000)

所以与其:

st=setTimeout(checkme,4000)

否则,立即调用该函数。

由于您在 checkme 函数中有相同的错误,它可能会由于无限递归而杀死您的浏览器。

于 2013-03-12T08:42:51.410 回答
5

setTimeout接受一个函数作为参数,并且将函数作为参数传递的正确方法是将其定义为匿名函数,或者仅提供函数名称。如果您使用括号(括号),您实际上并没有传递函数:您正在执行函数并将函数的结果传递给 setTimeout。

因此,当在 setTimeout 中指定函数时,以及需要将函数作为参数传递的任何其他位置时,不应使用括号。

于 2013-03-12T08:47:11.580 回答
1

如果您正在使用setTimeout(checkme(),4000),则您正在传递 checkme(); 的返回值;但是,如果您想将其作为函数传递,则需要通过以下方式进行

setTimeout(function(){checkme()},4000)

或者

st=setTimeout(checkme,4000)
于 2013-03-12T08:49:41.657 回答
1

您不应该在 setTimeout 函数中使用括号。您应该只传递对该方法的引用。您正在做的是调用该方法并将返回值传递给 set timeout 方法。

于 2013-03-12T08:43:49.967 回答