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

标签 javascript recursion

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

我首先是这样写的:

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/

相关文章:

javascript - 获取多维数组N个元素的所有组合

php - 从类别树中清除空类别

python - 使用Python递归进行日常编码挑战

PHP静态方法递归

python - 在 Python 中追加递归方法的最佳方式是什么?

javascript - 使用 javascript/jquery 检索文本值的简单方法(非提示)?

javascript - 如何使 <select> 标签项可拖动?

javascript - 在 html5 Canvas 中用鼠标旋转图像

javascript - 对象 es6 过滤器的双重嵌套数组

python - 如何使递归重命名操作(Linux,使用python)可逆?