(已解决)js书上碰到一个疑问,来请教下

//已解决,自己看的不仔细 [衰]

在javascript高级程序设计里有这么一个例子:

//为了实现result=[0,1,2 ....]

function createfunctions(){
      var result = new Array();
      
      for(var i=0;i<10;i++){
           result[i]=function(num){
                 //这里不应该已经可以拿到和外部变量对象里断开连接的i?
                 return function(){
                      return num
                 }
           }(i)
      }
      
      return result;
}

疑问:第一个匿名函数里已经把i作为参数传进去了,以参数的按值传递,num应该已经得到了一个i的副本,相当于断开了和次级的变量对象里的i的联系。这个时候不就可以直接return num 吗?为什么还要return一个匿名函数里再return num?

阅读 1.5k
3 个回答

应该是这个原因,你可以运行试一下

function createfunctions(){
        var result = new Array();
        
        for(var i=0;i<10;i++){
            result[i]=function(num){
                    return function(){
                        return num
                    }
            }(i)
        }
        
        return result;
    }
    
    var funArr = createfunctions();
    console.log(funArr);
    console.log(funArr[0]());
    console.log(funArr[1]());

还有这一段



    function createfunctions2(){
        var result = new Array();
        
        for(var i=0;i<10;i++){
            result[i]=function(num){
                    
                        return num

            }(i)
        }
        
        return result;
    }
    
    var funArr2 = createfunctions2();
    console.log(funArr2);
    console.log(funArr2[0]());
    console.log(funArr2[1]());

虽然第二个会有预想的效果,但是第一种更加好

按照这个写法,最后返回的result结果并不是[1,2,3...]。而是多个function。每个function返回改函数的下标。
按照这个效果理解就可以明白为什么要闭包封装。为什么要在闭包里在return 一个 function了

function createfunctions()
看方法名,这是要 create 一堆 function
不是要 create 一堆 int

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题