gpt4 book ai didi

javascript - JavaScript中的递归: don't quite understand

转载 作者:行者123 更新时间:2023-12-03 04:47:12 27 4
gpt4 key购买 nike

我正在练习使用递归,但有些东西我不太明白。例如,我写了这个简单的倒计时函数,它应该等到一秒过去,然后倒计时到下一秒。

我首先是这样写的:

function countdown(sec) {
console.warn(sec);
if(sec > 0) {
sec--;
setTimeout(countdown(sec), 1000);
}
}

每个日志之间不会等待一秒。这有效:

function countdown(sec){
console.warn(sec);
setTimeout(function() {
sec--;
if (sec > 0) {
countdown(sec);
}
}, 1000);
};

我真的不明白第一种方法有什么问题。我想这是我不太明白的 setTimeout 的问题,以及范围界定..?

预先感谢您的任何解释。

--- 已编辑并正在工作,谢谢大家! ---

我不知道 bind 被用作简写。

function countdown(sec) {
console.warn(sec);
if (sec > 0) {
sec--;
setTimeout(countdown.bind(null, sec), 1000);
}
}

最佳答案

JosephNields 对于您的代码无法正常工作的原因是正确的,但我还想强调,递归通常不涉及改变状态值,即 sec--

相反,只需传递sec - 1作为倒计时的下一个值。换句话说,将设置sec设置为较小的数字没有任何好处,只需使用较小的数字进行递归

var countdown = function (sec) {
console.log(sec)
if (sec > 0)
setTimeout(countdown, 1000, sec - 1)
}

countdown(10)

另外,知道计时器何时完成不是很好吗?此示例显示在递归时传递另一个值。

var countdown = function (sec, done) {
console.log(sec)
if (sec > 0)
setTimeout(countdown, 1000, sec - 1, done)
else
done()
}

countdown(5, function () {
console.log('timer is all done!')
})

关于javascript - JavaScript中的递归: don't quite understand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42819250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com