我正在尝试自学一些JavaScript并同时使用递归。我在下面写的代码我希望打印"吸气"在打印之间延迟5秒到控制台10次。但是,当我在Chrome的开发工具中观看控制台时,刷新页面后所有条目都会立即打印出来。任何人都可以帮我找到我的实现中的错误吗?谢谢!
function breathe(type, counter, limit, duration) {
if(counter <= limit) {
setTimeout(console.log(type), duration);
counter++;
return breathe(type, counter, limit, duration);
}
console.log("Finished!");
}
var breathing = breathe("inhale", 1, 10, 5000);
答案 0 :(得分:2)
function breathe(type, counter, limit, duration) {
if(counter <= limit) {
setTimeout(function(){console.log(type)}, duration);
counter++;
return breathe(type, counter, limit, duration);
}
console.log("Finished!");
}
var breathing = breathe("inhale", 1, 10, 5000);
方法需要函数ref。这应该有用。
$qd=$('#quoteDisplay')
$gd.fadeOut(complete: =>
$qd.text(quotes[randomNumber])
$gd.fadeIn()
)
答案 1 :(得分:1)
这是因为您正在立即执行console
语句(因为您通过console.log
执行()
),而不是将函数引用传递给setTimeout
:
setTimeout(console.log(type), duration);
请改为尝试:
setTimeout(function() {
console.log(type)
}, duration);
您可以使用的另一种形式(仅仅是为了传达函数引用的概念)是:
function callMeAfterDelay() {
console.log(type);
}
setTimeout(callMeAfterDelay, duration);
答案 2 :(得分:1)
setTimeout(console.log(type), duration);
这会立即执行console.log(type)
,然后将结果传递给setTimeout。 console.log的结果是undefined
,因此当超时发生时没有任何反应。
相反,你想这样做:
setTimeout(function () {
console.log(type);
}, duration);
答案 3 :(得分:0)
我认为这就是你想要的:
function breathe(type, counter, limit, duration) {
if(counter <= limit) {
setTimeout(function(){
console.log(type);
counter++;
return breathe(type, counter, limit, duration);
}, duration);
}
console.log("Finished!");
}
var breathing = breathe("inhale", 1, 10, 5000);
答案 4 :(得分:0)
var counter = 0;
var duration = 2000
var text = "Inhale";
var limit = 10;
function print(counter, duration, text, limit) {
setTimeout(function(){
console.log(text, counter)
counter++;
if (counter < limit) {
print(counter, duration, text, limit);
}
},duration)
};
print(counter, duration, text, limit);
&#13;
试试这个。