我正在编写一个长轮询脚本,并遇到了一个too much recursion错误,该错误使浏览器挂起。我的目标是使用setTimeout()每1000毫秒调用一次相同的函数。是的,我可以使用setInterval(),但这将是一个很长的轮询脚本,并且将等待服务器响应。

我通过从同一函数中调用的函数中删除()来解决此问题。

我的脚本看起来像:

function messagePolling(){
    console.log("polled")
    setTimeout(messagePolling(),1000) // <--- removing `()` from the function works as intended
}

messagePolling();


这背后的逻辑是什么? messagePolling毕竟不是一个函数。

最佳答案

您完全正确-messagePolling是一个函数。但是,messagePolling()不是函数。您可以在控制台中看到:

// assume messagePolling is a function that doesn't return anything
messagePolling() // -> undefined


因此,当您这样做时:

setTimeout(messagePolling(), 1000)


您实际上是在这样做:

setTimeout(undefined, 1000)


但是,当您这样做时:

setTimeout(messagePolling, 1000)


您实际上是将该函数传递给setTimeout。然后setTimeout将知道运行您传递的函数-messagePolling-以后。如果它决定以后再调用undefinedmessagePolling()的结果),它将不起作用,对吗?

10-04 21:51
查看更多