for循环中setInterval中的计数器变量i的范围

时间:2012-07-09 08:34:21

标签: javascript

如何在下面的函数中将'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

2 个答案:

答案 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)

这是因为当你的回调执行时,变量i3,你可以这样做:

    setTimeout((function(i){
      return function() {
        document.body.innerHTML += 'L'+i+'<br/>';
        document.getElementById('L'+i).style.display = 'block';
      };
    })(i), 1000+i*50);