【问题标题】:setTimeout with or without anonymous function? What's the difference?setTimeout 有或没有匿名函数?有什么不同?
【发布时间】:2013-03-12 08:37:33
【问题描述】:

我使用了这段代码(后面是填充“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?

谢谢

【问题讨论】:

    标签: javascript settimeout


    【解决方案1】:

    您需要删除

    中的括号
    st=setTimeout(checkme(),4000)
    

    所以改为:

    st=setTimeout(checkme,4000)
    

    否则,立即调用该函数。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          如果你使用setTimeout(checkme(),4000),你传递的是checkme()的返回值; 但是如果你想把它作为一个函数传递,你需要通过以下方式来做

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

          st=setTimeout(checkme,4000)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多