如何在下面的函数中将'i'设置为setInterval内的增量而不是读取'i'的最终值?
window.onload= function(){
var res = ['a','b','c']
for(i=0;i<res.length;i++){
document.body.innerHTML += "<li id='L"+i+"' style='display:none;'>"+res[i]+"</li>";
setTimeout(function(){
document.body.innerHTML += 'L'+i+'<br/>';
document.getElementById('L'+i).style.display = 'block'
},1000+i*50);
}
}
输出:
L3
L3
L3
答案 0 :(得分:2)
对于循环(或任何块),不像其他语言那样提供免费的新范围,您必须使用内联闭包或使用.forEach
的函数迭代来获取内联闭包作为“副作用”:
window.onload= function(){
['a','b','c'].forEach( function(letter, index) {
document.body.innerHTML += "<li id='L"+index+"' style='display:none;'>"+letter+"</li>";
setTimeout(function(){
document.body.innerHTML += 'L'+index+'<br/>';
document.getElementById('L'+index).style.display = 'block';
},1000+index*50);
});
}
如果需要,请在此处使用垫片以获得较旧的浏览器支持:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach
答案 1 :(得分:1)
这是因为当你的回调执行时,变量i
是3
,你可以这样做:
setTimeout((function(i){
return function() {
document.body.innerHTML += 'L'+i+'<br/>';
document.getElementById('L'+i).style.display = 'block';
};
})(i), 1000+i*50);