使用setInterval和Loop播放音频

时间:2014-09-20 16:40:17

标签: javascript arrays loops for-loop

我有这个数组:

var song = ['note1.mp3', 'note2.mp3', 'note3.mp3', 'note4.mp3']

for(i = 0; i < song.length; i++) {
  setInterval(function() {

    //play song[i]
    //or console.log(song[i]);

  }, 1000);

}

但这不起作用,有人知道为什么吗?我想播放note1.mp3然后是note2,note3和note4。

谢谢!

2 个答案:

答案 0 :(得分:1)

您有范围问题。所有回调都有一个i,您必须为每个i创建一个范围。您还必须区分回调。

http://jsfiddle.net/1xy4j3eq/7/

var song = ['a', 'b', 'c', 'd', 'e'];

$.each(song, function (i) {
    setTimeout(function () {
        $("div").text(song[i]);
    }, i * 1000);
});

答案 1 :(得分:0)

根据你的评论,你得到的行为是你总是得到最后一首歌。 这是因为区间函数在循环计数器i上关闭,因此它使用i在调用区间函数时的值,这将始终是最后一个值。

通常,您不应该像这样在循环内设置回调。相反,你可以做这样的事情

var song = ['note1.mp3', 'note2.mp3', 'note3.mp3', 'note4.mp3']
var makeCallback = function(index) { 
    return function() {
        console.log(index);
    }
}

for(i = 0; i < song.length; i++) {
  setInterval(makeCallback(i), 1000);            
}

因此为每次迭代生成不同的闭包