我正在练习使用递归,但有些事情我还不太了解。
例如,我编写了这个简单的倒计时功能,该功能应该等到一秒钟过去,直到倒数一秒。
我首先这样写:
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/