function box(){
var arr = [];
for(var i=0;i<5;i++){
arr[i] = (function(num){
//num在这里 //原理和上面一种方法一样的,所以可以实现闭包
return function(){ //在这个闭包里面再写一个匿名函数
return num;
};
})(i)
}
return arr;
}
var b = box();
alert(b[0]());
alert(box()[0]());
function box(){
var arr = [];
for(var i=0;i<5;i++){
arr[i] = function(num){
return num;
}(i);
}
return arr;
}
alert(box()[4]);
匿名函数在执行的时候他本身就传递给了一个变量arr[i],所以匿名函数的圆括号是可以去掉的。
还有一种使用ES6新语法 let 关键字 由于是新语法 各浏览器支持不同
<body>
<ul id="ul">
<li>1111</li>
<li>2222</li>
<li>3333</li>
<li>4444</li>
<li>5555</li>
</ul>
<script type="text/javascript">
var oul = document.getElementById("ul");
var ali = oul.getElementsByTagName("li");
for(let i = 0; i < ali.length; i++){
ali[i].onclick = function (){
alert(i);
}
}
</script>
</body>
使用let,声明的变量仅在块级作用域内有效,当前的 i 只在本轮循环有效,所以每次都是一个新的变量
可能你会问,如果每一轮循环的变量 i 都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值
这是因为Javascript引擎内部会记住上一轮循环的值,初始化本轮的变量 i 时,就在上一轮循环的基础上进行计算。