有或没有匿名函数的setTimeout?有什么不同?

时间:2013-03-12 08:37:33

标签: javascript settimeout

我使用了这段代码(后跟填充“tcap”textarea的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)

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

由于

4 个答案:

答案 0 :(得分:12)

你需要删除

中的parens
st=setTimeout(checkme(),4000)

所以相反:

st=setTimeout(checkme,4000)

否则,立即调用该函数。

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果您使用setTimeout(checkme(),4000),则传递checkme()的返回值; 但是如果你想将它作为一个函数传递,你需要按照以下方式进行操作

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

st=setTimeout(checkme,4000)