何时使用括号,什么时候不使用括号?

我怎么能说:

var myFunction = function() { setTimeout(myFunction, 1000); } myFunction(); 

为什么setTimeout中的函数调用不需要括号,但最后一行呢?

myFunction是一个函数

myFunction()调用该函数并产生该函数返回的值。

setTimeout的目的是在一段时间后运行代码。 你只需要传递函数给它(所以setTimeout本身可以在适当的时候调用函数),因为如果你在传递给setTimeout之前调用了函数(带圆括号),它现在会执行,而不是在1秒之后。

setTimeout函数需要一个函数引用*作为参数:引用是variables,并且没有括号。

函数调用需要括号(即使函数不带参数)。

Nutshell: myFunction是对函数的引用。 myFunction()执行函数,并在expression式中,将“等于”函数的返回值(如果没有返回值,则为undefined )。

深入挖掘:在某些情况下, setTimeout(myFunction(), 1000)可能是有意义的,就像myFunction()本身返回一个函数一样。 例如:

 var myFunction = function() { return function() { alert("ohai"); }; }; 
  • 匿名函数(包含单个return语句)立即执行。
  • 该函数的返回值本身就是一个包含alert的函数。

所以:

  • 单独的myFunction是对函数的引用(恰好返回一个函数)。
  • myFunction()将执行。 它评估为函数引用,适合setTimeout()

最后:

 setTimeout(myFunction(), 1000); 

这在一秒内调用myFunction()的返回值。 一秒钟后,popup警报。

另请参见为什么函数声明需要名称?

*或要评估的string,但最好是引用。

当你使用括号时,它说'现在调用这个函数'。 所以如果你说setTimeout(myFunction(),1000); ,它将使用函数的返回值作为超时的callback。 如果函数的返回值本身不是一个函数,那么你会得到一个错误,因为它会尝试执行一些在超时之后不可执行的东西(一个string,一个数字,未定义的等等)。

在第2行中,函数myFunction不被调用,而是作为parameter passing给setTimeout函数,而在第4行调用myFunction ; 要调用一个函数,即使没有参数,也总是要使用圆括号。