我正在编写一个长轮询脚本并遇到too much recursion
错误,该错误导致浏览器挂起。我的目标是使用setTimeout()
每1000毫秒调用相同的函数。是的,我可以使用setInterval()
,但它将是一个长轮询脚本,并将等待服务器响应。
我通过从同一函数中调用的函数中删除()
来修复此问题。
我的脚本如下:
function messagePolling(){
console.log("polled")
setTimeout(messagePolling(),1000) // <--- removing `()` from the function works as intended
}
messagePolling();
这背后的逻辑是什么? messagePolling
是一个功能,毕竟不是它。
答案 0 :(得分:5)
你绝对正确 - 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()
的结果),它会不会工作,对吗?
答案 1 :(得分:1)
写成
setTimeout(messagePolling(),1000)
函数立即执行 ,并且setTimeout
设置为在一秒钟后调用undefined
(函数返回的值)。 (如果在Node.js中运行,这实际上应该抛出一个错误,因为undefined
不是一个有效的函数)
写为setTimeout(messagePolling,1000)
setTimeout
设置为在一秒钟后调用您的函数。
答案 2 :(得分:0)
当您键入messagePolling
时,您将该函数作为参数传递给setTimeout
。这是使用setTimeout的标准方法。
当您键入messagePolling()
时,您正在执行该函数并将返回值传递给setTimeout
话虽这么说,这段代码对我来说很奇怪。这个功能只是自己运行。如果你这样做,它将无限期地继续运行。
答案 3 :(得分:0)
函数名称包含“()”的任何地方都会立即执行,除非它用引号括起来,即是一个字符串。