SetTimeout和黄瓜的递归性

时间:2014-04-29 14:45:21

标签: javascript settimeout cucumberjs

我有一个用javascript编写的函数,以递归的方式调用自己:

function f(attempt){
    if (attempt + 1 <= 10) {
        setTimeout(f(attempt + 1),2000);
    }
}
f(0);

由于未知原因,该功能被有效地调用了10次但没有任何延迟。 setTimeout似乎立即执行函数f。

然而,当我这样做时,一切正常:

function f(attempt){
if (attempt + 1 < 10) {
    setTimeout(function(){f(attempt + 1);},2000);
}}
f(0);

你有解释吗?是因为这段代码是为黄瓜测试编写的吗?

3 个答案:

答案 0 :(得分:3)

您必须将函数作为参数传递给setTimeout,这意味着f末尾没有括号。您现在正在做的是调用f并将其返回值传递给setTimeout。您可以将参数传递给f作为setTimeout的第三个参数。你的电话应该是这样的:

setTimeout(f, 2000, attempt + 1);

答案 1 :(得分:2)

setTimeout(f(attempt + 1),2000);

上面的代码调用了setTimeout函数,而不是传递函数来调用它传递你的f()函数的结果,它就在现场调用。

  setTimeout(function() { f(attempt + 1) },2000);

但是在这种情况下,你传递的函数引用要在2000秒内调用,因此它不会在现场评估函数本身。

答案 2 :(得分:0)

你应该这样写。 这是进行检查的另一种方法,没有私人变种。

function f(){
 if(++attempt<10){// not shure 
  setTimeout(f,2000);
 }
}
var attempt=0;
f();

<强>演示

http://jsfiddle.net/3nm2Q/