• 闭包与变量


    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

  • 相关阅读:
    SP375 QTREE
    「2017 山东一轮集训 Day5」字符串 (后缀自动机, 拓扑排序)
    [SDOI2016]生成魔咒(后缀自动机)
    bzoj3252: 攻略(贪心)
    bzoj2961 共点圆 (CDQ分治, 凸包)
    [CTSC2012]熟悉的文章 (后缀自动机 单调队列)
    bzoj3622: 已经没有什么好害怕的了
    [SDOI2013]泉(容斥)
    [SHOI2012]信用卡凸包(计算几何)
    CF1139D Steps to One (莫比乌斯反演 期望dp)
  • 原文地址:https://www.cnblogs.com/shn1637/p/3456605.html
Copyright © 2020-2023  润新知