【发布时间】:2021-04-30 12:47:44
【问题描述】:
不知道为什么在运行时它会同时打印数组中的两个点。为什么它不打印点暂停然后打印破折号然后点。我的条件写错了吗?
function morseCode(code) {
if (code.length === 0) {
return;
}
let ele = code[code.length - 1];
if (ele === "dot") {
setTimeout(() => {
console.log("dot");
}, 100);
} else {
setTimeout(() => {
console.log("dash");
}, 300);
}
return morseCode(code.slice(0, -1));
}
let code = ["dot", "dash", "dot"];
morseCode(code);
// print 'dot'
// pause for 100ms
// print 'dash'
// pause for 300ms
// print 'dot'
// pause for 100ms
【问题讨论】:
-
你已经基本同时设置了三个定时器,两个100ms,一个300ms,所以两个100ms定时器(点)完成并打印,100ms后300ms定时器完成。如果你想暂停,你需要调用
morseCode(),并在定时器内部使用切片数组。 -
setTimeout不会“暂停”代码执行。它的作用是......它将您传递给它的函数推入“堆栈”,并给出超时值。然后,一旦您的函数完成运行,浏览器将转到此“堆栈”(我还包含浏览器 UI 代码)并在将来超时时运行该函数。您在 100 毫秒时有 2 次超时,在 300 毫秒时有 1 次超时。请注意,代码可能不会以精确 100 毫秒运行。
标签: javascript arrays recursion settimeout