何时使用括号,什么时候不使用括号?
我怎么能说:
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
; 要调用一个函数,即使没有参数,也总是要使用圆括号。