在JavaScript中使用setTimeout()和setInterval()时调用函数
如果我使用setTimeout()和setInterval()调用一个命名函数,而不使用括号,那么它将按预期工作。当我用括号调用同一个函数时,它要么立即执行,要么给出一个错误 我正在寻找一个更深入的了解,在这个问题上,然后我在网上发现。 你们能解释一下为什么这是真的吗在JavaScript中使用setTimeout()和setInterval()时调用函数,javascript,Javascript,如果我使用setTimeout()和setInterval()调用一个命名函数,而不使用括号,那么它将按预期工作。当我用括号调用同一个函数时,它要么立即执行,要么给出一个错误 我正在寻找一个更深入的了解,在这个问题上,然后我在网上发现。 你们能解释一下为什么这是真的吗 var func = function(){ console.log("Bowties are cool."); } setTimeout(func(), 1500); // Prints "Bowties are co
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)".
必须将函数引用同时传递给
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很酷”)
,则可以将其封装在另一个函数中,如下所示:
setTimeout(function() {
console.log("Bowties are cool.")
}, 1500);
因此,您再次将函数引用传递给
setTimeout()
,该函数引用可以稍后执行,而不是立即执行,这正是您所做的。setTimeout和setInterval希望将函数引用传递给它们。您不应该在setTimeout和setInterval调用内调用该函数
不正确(不要这样做):
正确:
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函数,因为它需要参数“蝴蝶结很酷。”
。将其包装在匿名函数中可以解决此问题。在定义的函数后添加括号时,实际上是调用或调用该函数
但是,当您在另一个函数中作为参数传递函数时,您不想调用该函数,只想作为参数传递对该函数的引用(并且您传入的函数在需要时可以被调用)
有关一般回调函数的更多信息,.操作符
()
会导致调用该函数,因此当您在调用setTimeout()
时使用func()
会调用该函数,并将结果(返回值)传递给setTimeout()
。您应该传递一个函数,不是一个函数的结果(除非它返回一个函数)——那么它不起作用令人惊讶吗?函数在javascript中是一流的公民。您可以像传递任何其他变量一样进行传递。当您单独使用函数名时,您将传递对该函数的引用。当您使用括号()
时,您正在调用函数并传递该调用的结果。感谢您提供的链接。我以前读过这篇文章,但这个概念还没有被理解。当执行这篇文章时,javascript引擎采用什么样的逻辑路径?它首先看到什么,参数如何或以什么顺序放置在堆栈中?希望这个问题有意义。@Sufunija:如果你还有其他问题,请问另一个问题并解释你的意思。@Sufunija-我在回答中给了你一个同等执行顺序的例子。当您将func()
作为参数时,将首先对其求值,然后将其结果作为参数传递。
setTimeout(func, 1500);
setInterval(func, 1500);
setTimeout(function() {
console.log("Bowties are cool.");
}, 1500);
setInterval(function() {
console.log("Bowties are cool.");
}, 1500);