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值,依次返回110,但事实情况是,
函数数组中每个函数的返回结果都是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