无法在javascript中获取setTimeout以正常工作

时间:2012-06-21 07:19:02

标签: javascript

我在javascript中有一个函数:

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

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

setTimeout(test(), 1000);
事实上,它会调用,但不要等待1秒。所以我尝试使用它,如下所示,它的工作原理。

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

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

3 个答案:

答案 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);

这里,我从函数调用返回一个函数引用。有关详细信息,请参阅以下文章!

<强>文档