javascript - js 闭包问题(找到一个已经解决的答案)
怪我咯
怪我咯 2017-04-11 09:00:55
[JavaScript讨论组]

另一个解决问题的链接:https://segmentfault.com/q/1010000004671...

其实第一次的写法有点不合理,
var fuc=createFunctions();
console.log(fuc);
两段代码返回的都是一个函数数组,
改成console.log(fuc[0](2)),就发现问题所在了。

看书的时候有这么两段代码,书上解释得比较晦涩,求高人指点

function createFunctions(){
  var result = new Array();
  for(var i=0;i<10;i++){
      result[i]=function(){
          return i;
      };
  }
  return result;
}
var fuc=createFunctions();
console.log(fuc);
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 fuc=createFunctions();
console.log(fuc);
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(3)
PHP中文网

第一段代码数组中存储的只是函数

for(var i=0;i<10;i++){
      result[i]=function(){
          return i;
      };
  }

变量i是createFunctions这个作用域中的,所以在后来的调用时是10。
第二段代码中打包了一个参数num,数组中每个函数都打包了这个定义时的参数,而在定义时这个参数各不相同,所以在后面的调用结果也就不同。
总之要记住,闭包是因为有内部作用域的参数进行了穿越,呵呵!

高洛峰

两段代码数组中,存储的都是函数
只是第一段是一种错误的写法

知识点还是闭包函数变量作用域

怪我咯

看了半天终于搞懂了,自己来回答。
第一段代码:result返回了一个函数数组,数组中每一个函数的作用域链中都保存着createFunctions()函数的活动对象,所以在外部调用这个函数以后,i的值变为10,那么此时函数数组中所有的i也就是10。

第二段代码

result[i]=function(num){
    return function(){
        return num;
      };
    }(i);

function(num){...}(i)是自执行函数,由于函数的参数是按值传递的,也就是说,被传递的i会被复制给函数内部的局部变量num,所以每次执行的i并不相同,那么函数内部的变量num的值也就并不相同

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号