zoukankan      html  css  js  c++  java
  • 闭包与变量

    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

  • 相关阅读:
    sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
    busybox程序连接 ln怎么回事?怎样实现的
    有线网卡与无线网卡同时使用
    "$(@:_config=)"
    C#中Global文件
    Win7 IIS7 HTTP 错误 404.2 Not Found解决方法
    C#中的日期处理函数
    js字母大小写转换
    asp.net发布到IIS中出现错误:处理程序“PageHandlerFactoryIntegrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
    sql server在存储过程中使用游标和事务
  • 原文地址:https://www.cnblogs.com/shn1637/p/3456605.html
Copyright © 2011-2022 走看看