2

我在javascript中有一个函数:

function test(){
...
    if (){
        setTimeout(test(), 1000);
    }
}

根据手册,我可以这样称呼:

setTimeout(test(), 1000);

事实上,它会调用,但不要等待 1s。所以我尝试像下面这样使用它并且它有效。

setTimeout(function(){test();}, 1000);  

任何人都可以向我解释这个吗?

4

3 回答 3

3

哪个手册?调用test()将调用返回的东西test()并将其传递给setTimeout,因此除非您test()返回一个函数,否则这将不起作用。

您可以使用 anon 函数替代方案,也可以像setTimeout(test, 1000)没有().

您可能会发现另一个不好的用法是将其作为字符串传递,例如:

setTimeout("test()", 1000)

不惜一切代价避免这种情况,因为这相当于打电话eval,你迟早会遇到范围问题。

于 2012-06-21T07:20:38.243 回答
2

你应该打电话给

setTimeout(test, 1000);

而不是

setTimeout(test(), 1000);

也就是说,你要在1000ms后调用的函数是test,而不是调用test的结果!

之所以

setTimeout(function(){test();}, 1000);  

起作用的是,你在1000ms后调用的函数是调用test的函数,它基本上是test它自己。对于 lambda 微积分极客来说,这称为 eta-reduction。

于 2012-06-21T07:22:23.240 回答
1

setTimeout需要一个函数引用。当你通过它时:

setTimeout(test(), 1000);

那就是将调用函数的结果传递给. 相反,将引用传递给它以测试自身:testsetTimeout

setTimeout(test, 1000);

想看一些花哨的东西吗?

function test () {
    var what_are_you = 'a closure';
    return function () {
       alert('I am '+what_are_you+'!')
    }
}
setTimeout(test(), 1000);

在这里,我从函数调用返回一个函数引用。有关更多信息,请参阅下面的文章!

文档

于 2012-06-21T07:23:03.307 回答