我正在编写一个长轮询脚本,并遇到了一个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
-以后。如果它决定以后再调用undefined
(messagePolling()
的结果),它将不起作用,对吗?