闭包的触发和解决
1.触发情况:在函数内部还有函数,并且内部的函数被保存到外部时会发生闭包。
2.用一个简单的例子来展示:
<script>
function test() {
var arr = [];
for(var i = 0; i < 10; i ++){
arr[i] = function (){
document.write(i + ' ');
}
}
return arr;
}
var Myarr = test();
for(var i = 0; i < 10; i ++){
Myarr[i]();
}
</script>
运行结果:
10 10 10 10 10 10 10 10 10 10
- 分析:这里希望给数组每一位赋值一个能打印当前数组下标的函数,但是函数在定义时没有被执行,当数组被保存到外部时,函数里面的 i 已经变成10了。
3.解决方法:立即执行函数
<script>
function test() {
var arr = [];
for(var i = 0; i < 10; i ++) {
(function(j) {
arr[j] = function () {
document.write(j + ' ');
}
}(i))
}
return arr;
}
var Myarr = test();
for(var i = 0; i < 10; i ++) {
Myarr[i]();
}
</script>
运行结果:
0 1 2 3 4 5 6 7 8 9
- 分析:要想让数组的下标实时被保存下来,应该使用立即执行函数把当前的 i 值赋值给形参 j ,那么Myarr在被赋值时就能获取每个数组成员的作用域链得到 j 的值。