SetTimeout递归(Javascript)

SetTimeout递归(Javascript),javascript,recursion,Javascript,Recursion,下面的代码递归地播放音频元素并跟踪文本的迭代,这两种迭代都通过清除超时的按钮停止 如果将播放超时指定给外部功能nextThing,当单击停止按钮时,音频将在文本停止后再次播放。但是,在playTimeout的评论(内部)版本中,音频会立即停止 问题:a)为什么会发生这种情况?和b)我如何正确表达这一点,以便迭代和音频一起移动 function nextThing(millis,pitch){ setTimeout(playTone,millis,pitch); }; function t

下面的代码递归地播放音频元素并跟踪文本的迭代,这两种迭代都通过清除超时的按钮停止

如果将播放超时指定给外部功能
nextThing
,当单击停止按钮时,音频将在文本停止后再次播放。但是,在playTimeout的评论(内部)版本中,音频会立即停止

问题:a)为什么会发生这种情况?和b)我如何正确表达这一点,以便迭代和音频一起移动

function nextThing(millis,pitch){
    setTimeout(playTone,millis,pitch);
};
function timedCount(millis){
    document.getElementById('txt').value=iteration;
    playTimeout=nextThing(millis,"C3");     
//  playTimeout=setTimeout(playTone,millis,"C3")
    doRecursion=setTimeout(function(){timedCount(millis)},millis);      
    iteration++;
    console.log("made it");
}

您的
nextThing
函数没有返回任何内容,计时器id被忽略,它将
undefined
分配给
playTimeout

function nextThing(millis, pitch) {
    return setTimeout(playTone, millis, pitch);
//  ^^^^^^
}

您的
nextThing
函数没有返回任何内容,计时器id被忽略,它将
undefined
分配给
playTimeout

function nextThing(millis, pitch) {
    return setTimeout(playTone, millis, pitch);
//  ^^^^^^
}

啊哈!因此,由于没有实际的ID值来清除超时,即将到来的音频超时按计划发生,即使相应的递归被破坏,因此不再调用。啊哈!因此,由于没有实际的ID值来清除超时,即将到来的音频超时按计划发生,即使相应的递归被破坏,因此不再调用。