我在javascript中有一个函数:
function test(){
...
if (){
setTimeout(test(), 1000);
}
}
根据手册,我可以这样称呼:
setTimeout(test(), 1000);
事实上,它会调用,但不要等待1秒。所以我尝试使用它,如下所示,它的工作原理。
setTimeout(function(){test();}, 1000);
任何人都可以向我解释这个问题吗?
答案 0 :(得分:3)
哪本手册?致电test()
会调用test()
返回的内容并将其传递给setTimeout
,因此,除非您test()
正在返回某个功能,否则无效。
您可以使用anon功能替代,或者您可以像setTimeout(test, 1000)
一样传递它而不使用()
。
您可能会发现的另一个不良用法是将其作为字符串传递:
setTimeout("test()", 1000)
不惜一切代价避免这种情况,因为这相当于调用eval
并且您迟早会遇到范围问题。
答案 1 :(得分:2)
你应该用
打电话setTimeout(test, 1000);
而不是
setTimeout(test(), 1000);
换句话说,1000 ms后要调用的函数是test,而不是调用test的结果!
原因
setTimeout(function(){test();}, 1000);
的工作原理是你在1000ms之后调用的函数是一个调用test的函数,它本身就是test
。对于lambda calculus geeks,这称为eta-reduction。
答案 2 :(得分:1)
setTimeout
需要一个函数引用。当你通过它时:
setTimeout(test(), 1000);
即将调用test
函数的结果传递给setTimeout
。相反,将它传递给测试本身:
setTimeout(test, 1000);
想看一些奇特的东西吗?
function test () {
var what_are_you = 'a closure';
return function () {
alert('I am '+what_are_you+'!')
}
}
setTimeout(test(), 1000);
这里,我从函数调用返回一个函数引用。有关详细信息,请参阅以下文章!
<强>文档强>
setTimeout
- https://developer.mozilla.org/en/DOM/window.setTimeout