Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中使用setTimeout()和setInterval()时调用函数_Javascript - Fatal编程技术网

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

在JavaScript中使用setTimeout()和setInterval()时调用函数,javascript,Javascript,如果我使用setTimeout()和setInterval()调用一个命名函数,而不使用括号,那么它将按预期工作。当我用括号调用同一个函数时,它要么立即执行,要么给出一个错误 我正在寻找一个更深入的了解,在这个问题上,然后我在网上发现。 你们能解释一下为什么这是真的吗 var func = function(){ console.log("Bowties are cool."); } setTimeout(func(), 1500); // Prints "Bowties are co

如果我使用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)".

必须将函数引用同时传递给
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);