我正在练习使用递归,但有些事情我还不太了解。
例如,我编写了这个简单的倒计时功能,该功能应该等到一秒钟过去,直到倒数一秒。

我首先这样写:

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);
   }
}

最佳答案

setTimeout的第一个参数应该是一个函数。

当您调用setTimeout(countdown(sec),1000)时,它将被评估为setTimeout(undefined, 1000),因为countdown(sec)不返回值。

您的第二种方法有效,但是作为简写,您也可以这样做:setTimout(coundown.bind(null, sec), 1000)。这将创建一个在调用时将执行countdown(sec)的函数,该函数基本上等同于以下内容:

setTimeout(
    function() {
        countdown(sec);
    },
    1000
);


更多信息在这里:
Use of the JavaScript 'bind' method

关于javascript - javascript中的递归:不太了解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42819250/

10-12 14:18