为什么我可以说:何时使用括号,何时不使用括号?
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
为什么在setTimeout
函数调用不需要括号,但最后一行呢?
为什么我可以说:何时使用括号,何时不使用括号?
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
为什么在setTimeout
函数调用不需要括号,但最后一行呢?
myFunction
是一个功能
myFunction()
调用函数和产量的任何值函数返回。
setTimeout的目的是在经过一段时间后运行代码。你只需要传递函数给它(所以setTimeout本身可以在适当的时候调用函数),因为如果你在将函数传递给setTimeout之前调用了函数(使用圆括号),它将执行现在而不是1秒后。
setTimeout
函数需要函数引用*作为参数:引用是变量,并且没有括号。
函数调用需要圆括号(即使函数不带参数)。
果壳:myFunction
是对该功能的参考。 myFunction()
执行该函数,并且在表达式中,将“等于”函数的返回值(如果没有返回值,则为undefined
)。
深入探讨:有些情况下,setTimeout(myFunction(), 1000)
可能是有意义的,如果myFunction()
本身返回功能等。例如:
var myFunction = function() {
return function() {
alert("ohai");
};
};
return
语句)被立即执行。alert
的函数。所以:
myFunction
是一个函数的引用(恰好返回功能)。myFunction()
将执行。它评估为功能参考,适用于setTimeout()
。最后:
setTimeout(myFunction(), 1000);
这在一秒钟内来电myFunction()
的返回值。一秒钟后,弹出警报。
参见Why function statement requires a name?
*或字符串进行评价,但基准是优选的。
他说什么^^^^^ – JonH
奇怪。 JavaScript是一种古怪的语言。 –
@cf_PhillipSenn:它在Python或C(函数指针)中基本相同。只提供函数的名称引用它。在它后面添加括号可以调用它。当然,这在函数不是第一类对象的语言中不存在,因此不能直接引用(如Java)。 –
在第2行,函数myFunction
不叫,但作为一个参数传递给setTimeout
函数传递,而在第4行myFunction
被调用;要调用某个函数,即使没有参数,您也必须使用括号,即使总是。
我认为一个25瓦的灯泡刚刚亮起。 –
当您使用括号时,它说“现在调用此函数”。所以如果你说setTimeout(myFunction(),1000);
,它将使用该函数的返回值作为超时回调。如果函数的返回值本身不是一个函数,那么你会得到一个错误,因为它会尝试执行一些在超时后(字符串,数字,未定义等)不可执行的东西。
啊是的。好。谢谢! –
虽然,值得注意的是:如果返回的字符串是可执行的,比如说alert(“Hello world!”);'它会在这个上下文中工作,因为'setTimeout'可以接受字符串作为js代码文字。 – Chris
哦......这很有道理。 –