在同一个函数中调用`Function` vs`Function()`

时间:2016-09-24 19:02:58

标签: javascript jquery

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

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

我的脚本如下:

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

messagePolling();

这背后的逻辑是什么? messagePolling是一个功能,毕竟不是它。

4 个答案:

答案 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。如果它决定稍后致电undefinedmessagePolling()的结果),它会不会工作,对吗?

答案 1 :(得分:1)

写成 setTimeout(messagePolling(),1000)函数立即执行 ,并且setTimeout设置为在一秒钟后调用undefined(函数返回的值)。 (如果在Node.js中运行,这实际上应该抛出一个错误,因为undefined不是一个有效的函数)

写为setTimeout(messagePolling,1000) setTimeout设置为在一秒钟后调用您的函数。

答案 2 :(得分:0)

当您键入messagePolling时,您将该函数作为参数传递给setTimeout。这是使用setTimeout的标准方法。

当您键入messagePolling()时,您正在执行该函数并将返回值传递给setTimeout

话虽这么说,这段代码对我来说很奇怪。这个功能只是自己运行。如果你这样做,它将无限期地继续运行。

答案 3 :(得分:0)

函数名称包含“()”的任何地方都会立即执行,除非它用引号括起来,即是一个字符串。