我正在练习使用递归,但有些东西我不太明白。 例如,我写了这个简单的倒计时函数,它应该等到一秒过去,然后倒计时到下一秒。
我首先是这样写的:
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/