在循环中调用 setTimeout 未按预期工作

use*_*693 7 javascript loops settimeout

以下 JavaScript 应该(在我看来)播放间隔 0.5 秒的音符序列。但它把它们全部作为一个单一的同时和弦播放。知道如何修复它吗?

function playRecording() {
    if (notes.length > 0) {
        for (var i = 0; i < notes.length; i++) {
            var timeToStartNote = 500 * i;
            setTimeout(playNote(i), timeToStartNote);
        }
    }
}

function playNote(i) {
    var noteNumber = notes[i];
    var note = new Audio("/notes/note_" + noteNumber + ".mp3");
    note.play();
}
Run Code Online (Sandbox Code Playgroud)

tym*_*eJV 6

JavaScript 闭包,将其包装在一个自执行函数中:

for (var i = 0; i < notes.length; i++) { 
    (function(i) {
       var timeToStartNote = 500 * i;
       setTimeout(function() {
           playNote(i)
       }, timeToStartNote);
    })(i)
}
Run Code Online (Sandbox Code Playgroud)


use*_*693 4

谢谢各位,这是我问题的完整解决方案:

function playRecording() {
    if (notes.length > 0) {
        for (var i = 0; i < notes.length; i++) {
            playNote(i);
        }
    }
}

function playNote(i) {
    setTimeout(function () {
        var noteNumber = notes[i];
        var note = new Audio("/notes/note_" + noteNumber + ".mp3");
        note.play();
    }, 500 * i);
}
Run Code Online (Sandbox Code Playgroud)