我怎么可以说:
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
为什么函数调用setTimeout
不需要括号,而最后一行呢?
我怎么可以说:
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
为什么函数调用setTimeout
不需要括号,而最后一行呢?
该setTimeout
函数需要一个函数引用*作为参数:引用是变量,没有括号。
函数调用需要括号(即使函数没有参数)。
Nutshell: myFunction
是对函数的引用。myFunction()
执行函数,并且在表达式中,将“等于”函数的返回值(或者undefined
如果没有返回任何值)。
深入挖掘:有些情况setTimeout(myFunction(), 1000)
可能是有意义的,比如它myFunction()
本身返回一个函数。例如:
var myFunction = function() {
return function() {
alert("ohai");
};
};
return
语句)立即执行。alert
.所以:
myFunction
单独是对函数的引用(恰好返回一个函数)。myFunction()
将执行。它评估为函数引用,适用于setTimeout()
.最后:
setTimeout(myFunction(), 1000);
这会myFunction()
在一秒钟内调用的返回值。一秒钟后,向上弹出警报。
另请参阅为什么函数语句需要名称?
* 或要评估的字符串,但首选引用。
myFunction
是一个函数
myFunction()
调用函数并产生函数返回的任何值。
setTimeout 的目的是在经过一段时间后运行代码。你需要的功能只是传递给它(这样的setTimeout可以自称在适当的时候函数),因为如果你将它传递给setTimeout的前调用的函数(用括号),将执行现在而不是1秒后,。
当您使用括号时,它表示“现在调用此函数”。因此,如果您说setTimeout(myFunction(),1000);
,它将使用函数的返回值作为超时的回调。如果函数的返回值本身不是函数,您将收到错误,因为它会尝试执行超时后不可执行的内容(字符串、数字、未定义等)。
在第 2 行中,函数myFunction
没有被调用,而是作为参数传递给setTimeout
函数,而在第 4 行中myFunction
被调用;要调用函数,您总是必须使用括号,即使没有参数。
如果可以的话,我认为这个例子会更清楚,
function callback() {
console.log('this function runs on page loads.');
}
setTimeout(callback(), 2000);
这里的callback()
函数将在页面加载后立即运行,不会等待 2 秒。
function callback() {
console.log('this function runs after page loads.');
}
setTimeout(callback, 2000);
这里的callback()
函数将在 2 秒后运行。