javascript
2012-07-09 59 views 0 likes 
0

如何在下面的函数中将'i'设置为在setInterval内部增量而不是读取'i'的最终值?计数器变量i的范围在for循环中的setInterval中

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

https://developer.mozilla.org/en/ JavaScript的/指南/闭包 – andlrc 2012-07-09 08:36:03

+0

可能重复[Javascript闭合内循环 - 简单实用的例子](http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – 2012-07-09 08:39:09

回答

2

For循环(或任何块对于这个问题)不提供像其他语言一样的免费新范围,您必须使用内联关闭或使用功能迭代.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

一个解决方案,但与旧版浏览器不兼容..请解释... – andlrc 2012-07-09 08:37:16

+2

@AndreasAL你不应该因为这个而失望。没有哪个地方需要陈旧的浏览器。特别是当我刚刚在解释 – Esailija 2012-07-09 08:37:50

+0

中编辑时,我删除了我的downvote。正如我现在看到你已经解释过这一点。好...但你不认为它是一个更好的方法告诉cronoklee关闭关闭,而不是给下摆一个新的解决方案女巫dosn't使裙摆更熟练的程序员? – andlrc 2012-07-09 08:41:12

1

这是因为你的回调执行时,变量i3,你可以做到这一点象下面这样:

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

'setTimeout 'callback * *已经是一个闭包(否则它不能访问'i')。你所添加的是一个自我执行的函数来创建一个新的范围,严格地说,这不是一个闭包。 – 2012-07-09 08:40:58

+1

@FelixKling我们可以说参数变量'i'在关闭中吗? – xdazz 2012-07-09 08:42:46

+0

我不知道你是什么意思...从自调用函数返回的函数是一个关闭,因为它关闭'i'。 – 2012-07-09 08:43:56

相关问题