在JavaScript中使用setTimeout()和setInterval()时调用函数

suf*_*nja 5 javascript

如果我使用setTimeout()和setInterval()调用命名函数而不使用括号,它将按预期工作.当我用括号调用相同的函数时,它会立即执行它或者给出错误.

我正在寻找一个更深入的了解这个问题,然后我在网上找到了什么.你们能告诉我为什么这是真的吗?

var func = function(){
    console.log("Bowties are cool.");
}

setTimeout(func(), 1500);
// Prints "Bowties are cool." immediately

setInterval(func(), 1500);
// Throws an error

setInterval(func, 1500);
// Works as expected

setTimeout(console.log("Bowties are cool."),1500);
// This method has the same result as "setTimeout(func(), 1500)".
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 5

您必须将函数引用传递给setTimeout()setInterval().这意味着你传递一个没有()后面的函数名或你传递一个匿名函数.

当您()在函数名称之后包含func(),您将立即执行该函数,然后将返回结果传递给setInterval()setTimeout().除非函数本身返回另一个函数引用,否则它将永远不会执行您想要的操作.对于Javascript程序员来说,这是一个非常常见的错误(我在学习语言时犯了同样的错误).

所以,正确的代码是:

setTimeout(func, 1500);
setInterval(func, 1500);
Run Code Online (Sandbox Code Playgroud)

如果您知道其他使用指针的语言,您可以将函数的名称()视为后面的函数,就像指向函数的指针一样,这就是函数引用在Javascript中的含义,这就是您在需要时传递给函数的内容以后能够执行某些功能,而不是立即执行.


当你错误地这样做:

setTimeout(func(), 1500);
setInterval(func(), 1500);
Run Code Online (Sandbox Code Playgroud)

它正在func()立即执行,然后将返回结果传递给setTimeout()setInterval().由于你func()没有返回任何东西,你基本上是这样做的:

func();
setTimeout(undefined, 1500);
Run Code Online (Sandbox Code Playgroud)

这是你观察到的,但不是你想要的.


此外,如果您想执行特定的函数调用,例如console.log("Bowties are cool."),那么您可以将其包装在另一个函数中,如下所示:

setTimeout(function() {
    console.log("Bowties are cool.")
}, 1500);
Run Code Online (Sandbox Code Playgroud)

所以,你再次传递一个函数引用setTimeout(),可以执行LATER,而不是立即执行它,这就是你正在做的事情.