1.闭包与变量
闭包的作用域链有一个明显的副作用。闭包总是获得外部函数变量
的最终值。如:
functioncreateFunctions()
{
varresult=newArray();
for(vari=0;i<10;i++)
{
result[i]=function()
{
returni;
};
}
returnresult;
}
varfuncArr=createFunctions();
alert(funcArr[0]()); // 10
alert(funcArr[1]()); // 10
// ...
alert(funcArr[9]()); // 10
上面的代码中,外部函数产生一个函数数组并返回。函数数组中
的每个元素都是一个函数,每个函数都返回i变量。看起来,每个
函数应该返回每次循环的i值,依次返回1到10,但事实情况是,
函数数组中每个函数的返回结果都是10。这是因为,每个内部函数
返回的是变量i,而不是i在某个时刻的特定值。而i的作用域是
整个外部函数,当外部函数执行完成后,i的值是10。
可以通过在每个内部函数的内部,再产生一个匿名函数并返回来解
决上面的问题。如:
functioncreateFunctions()
{
varresult=newArray();
for(vari=0;i<10;i++)
{
result[i]=function(num)
{
returnfunction()
{
returnnum;
};
}(i); //使得该层匿名函数立即执行
}
returnresult;
}
varfuncArr=createFunctions();
alert(funcArr[0]()); // 0
alert(funcArr[1]()); // 1
// ...
alert(funcArr[9]()); // 9