闭包
示例代码
function test(){
var arr = [];
for(var i = 0 ; i<10;i++)
{
arr[i] = function(){
document.write(i);
}
}
return arr;
}
var myArr = test();
for(var j = 0 ; j<10;j++)
{
myArr[j]();//结果为10个10
}
原因解析 :在进行arr赋值时,由于方法体并没有执行,所以10个方法的i是共用的,在执行完test()后,此时的i相当于缓存在myArr中,且存入的值是test()的AO销毁前值,在销毁之前i存储的值是10
解决方法:使用立即执行函数处理
function test(){
var arr = [];
for(var i = 0 ; i<10;i++)
{
(function(k){//此处隐式使用闭包的存储功能,存储的内容为k的数据
arr[k] = function(){
document.write(k);
}
}(i));//使用立即执行函数的实参,当执行myArr[i]时,查询的变量i即就转化为对应的立即执行函数的形参k
}
return arr;
}
var myArr = test();
for(var j = 0 ; j<10;j++)
{
myArr[j]();//结果为10个10
}
代码练习
var x = 1;
if(function c(){}){
x+=typeof(c);
}
console.log(x);//输出结果为1undefined