如果我使用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)
您必须将函数引用传递给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,而不是立即执行它,这就是你正在做的事情.
| 归档时间: |
|
| 查看次数: |
1084 次 |
| 最近记录: |