将参数传递给递归函数

时间:2018-08-01 01:26:51

标签: javascript recursion this settimeout

所以我有一个使用setTimeout()的递归函数,但我不知道如何继续将参数传递给setTimeout()正在调用的递归函数。我尝试使用.bind(null, time)并以这种方式传递参数,但这似乎不起作用。

我还尝试了使用setTimeout的第三个选项,该选项我认为是用于传递变量的,但似乎也不起作用。我将尝试用我的代码示例进行解释...

我正在使用此功能的唯一方法是设置不同的超时延迟。

function delay(t) {
    return (500 - (t * pattern.length));
}

这就是给我带来麻烦的原因

function next(time) {
    //random code ~turn on//

    setTimeout(function() {
        //random code ~turn off//

        if(score < 50) { 
        setTimeout(next.bind(null, time), delay(time));
        }
    }, delay(time));
}

当我调用函数时

next(30)

我的代码的//random code ~turn on部分运行正常,但是setTimeut函数几乎没有任何延迟地运行。就像没有传递time变量(30)一样。控制台中也没有错误代码。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我不确定您是在尝试做复杂的事情还是在使简单的事情复杂化。但是,按原样编写代码,最大的问题是您正在遮盖time参数:

function next(time) {
    //random code ~turn on//

    setTimeout(function(time) {
        // time is now undefined, because nothing is passed in
        // to to setTimeout third param


        if(score < 50) { 
         // time here no longer refers to the `time` passed into
         // next, but rather the undefined value delcared as a parameter 
         // to the callback to setTimeout.
         setTimeout(next.bind(null, time), delay(time));
        }
    }.bind(null, time), delay(time));
}

结果是您的超时以未定义的延迟被调用。删除它可以使其正常工作(如果我了解您在做什么)。您还可以将超时函数传递给捕获time闭包的超时,因此不需要绑定:

// fake score and delay for demonstration purposes
function delay(t) {
    return t;
}

function next(time) {
    setTimeout(function() { // don't pass a paran here (or if you do, rename it)
        let score = Math.random()
        console.log("running", score)
        if(score < .80) { 
           setTimeout(next.bind(null, time), delay(time));
        }
    }, delay(time));
}
next(1000)