我在javascript中有一个函数:
function test(){
...
if (){
setTimeout(test(), 1000);
}
}
根据手册,我可以这样称呼:
setTimeout(test(), 1000);
事实上,它会调用,但不要等待 1s。所以我尝试像下面这样使用它并且它有效。
setTimeout(function(){test();}, 1000);
任何人都可以向我解释这个吗?
我在javascript中有一个函数:
function test(){
...
if (){
setTimeout(test(), 1000);
}
}
根据手册,我可以这样称呼:
setTimeout(test(), 1000);
事实上,它会调用,但不要等待 1s。所以我尝试像下面这样使用它并且它有效。
setTimeout(function(){test();}, 1000);
任何人都可以向我解释这个吗?
哪个手册?调用test()
将调用返回的东西test()
并将其传递给setTimeout
,因此除非您test()
返回一个函数,否则这将不起作用。
您可以使用 anon 函数替代方案,也可以像setTimeout(test, 1000)
没有()
.
您可能会发现另一个不好的用法是将其作为字符串传递,例如:
setTimeout("test()", 1000)
不惜一切代价避免这种情况,因为这相当于打电话eval
,你迟早会遇到范围问题。
你应该打电话给
setTimeout(test, 1000);
而不是
setTimeout(test(), 1000);
也就是说,你要在1000ms后调用的函数是test,而不是调用test的结果!
之所以
setTimeout(function(){test();}, 1000);
起作用的是,你在1000ms后调用的函数是调用test的函数,它基本上是test
它自己。对于 lambda 微积分极客来说,这称为 eta-reduction。
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
在 MDN - https://developer.mozilla.org/en/DOM/window.setTimeout