我有这个数组:
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。
谢谢!
答案 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);
}
因此为每次迭代生成不同的闭包