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

时间:2015-08-21 16:30:02

标签: 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)".

3 个答案:

答案 0 :(得分:5)

您必须将功能参考传递给setTimeout()setInterval()。这意味着您传递一个函数名称后不带()或传递匿名函数。

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

所以,正确的代码是:

setTimeout(func, 1500);
setInterval(func, 1500);

如果您知道其他使用指针的语言,您可以将()后面的函数的名称想象成函数的指针,这就是Javascript中的函数引用,这就是你的意思当你希望它能够稍后执行某个函数时,传递给函数,而不是立即执行。

当你错误地这样做时:

setTimeout(func(), 1500);
setInterval(func(), 1500);

它会立即执行您的func(),然后将返回结果传递给setTimeout()setInterval()。由于您的func()没有返回任何内容,因此您基本上是这样做的:

func();
setTimeout(undefined, 1500);

你观察到的是什么,但不是你想要的。

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

setTimeout(function() {
    console.log("Bowties are cool.")
}, 1500);

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

答案 1 :(得分:0)

setTimeout和setInterval期望将函数 reference 传递给它们。您不应该在setTimeout和setInterval调用中调用该函数。

不正确( 不要这样做 ):

setTimeout(func(), 1500);
setInterval(func(), 1500);
setTimeout(console.log("Bowties are cool."), 1500);
setInterval(console.log("Bowties are cool."), 1500);

正确:

setTimeout(func, 1500);
setInterval(func, 1500);
setTimeout(function() {
    console.log("Bowties are cool.");
}, 1500);
setInterval(function() {
    console.log("Bowties are cool.");
}, 1500);

注意我是如何在一个匿名函数中包装console.log以便将它与setInterval和setTimeout一起使用的。我无法将console.log传递给setInterval和setTimeout函数,因为它需要参数"Bowties are cool."。将它包装在匿名函数中解决了这个问题。

答案 2 :(得分:0)

在定义的函数后添加括号时,实际上是调用或调用函数。

但是当你将一个函数作为参数传递给另一个函数时,你不想调用该函数,你只想将这个函数的引用传递给参数,(你传入的函数将是可在需要时调用。)

有关回调函数的更多信息,请here