遇到一个闭包的问题~

题目描述是这样的:

实现一个函数makeClosures,调用之后满足如下条件:
1. 返回一个函数数组result,长度与arr相同
2. 运行result中第i个函数,即result[i] (),结果与fn(arr[i])相同

  • 返回一个函数数组result,长度与arr相同
  • 运行result中第i个函数,即result[i] (),结果与fn(arr[i])相同

首先遇到的第一个问题就是函数数组啊,什么叫函数数组啊,记忆里好像压根就没见过,悲伤!
查阅资料之后,so easy!平时里见的比较多数组元素是数值或者字符串,函数数组就是函数作为数组的元素啊,即result[i]=function(){…….}。所以啊,不管它里面的元素怎么变它都是个数组,所以函数里返回的时候可以是return result,这样返回的是里面的各个函数元素。但是!!注意!!!要想输出里面函数元素的返回值的时候一定不能那样写! 所以应该怎么输出呢?下面容我啰嗦一会哈!
结合例子:t=makeClosures(arr,fn);
1>alert(t):输出的是函数数组里面的函数元素。即result[ function1, function2, function3,…… ]里面的function
2>alert(t[i]):同上
3>alert( t[i] ()):这次取出的才是function的返回值!

好啦!~函数数组就暂时告一段落啦!

接下来的一个问题是匿名函数的问题~
错误代码:

    function makeClosures(arr,fn){
      var result=new Array();
      for(i=0;i<arr.length;i++){
        result[i]=function(){
              return fn(arr[i]);
         };

      }
      return result;
    }

上面的错误语句,导致result中每个函数的参数都是arr[arr[i].length]。 fn不能立即执行,需要父函数的循环体执行完毕才能执行,这是循环闭包中的一个问题,为了避免这个问题我们可以用一个具有传参功能的匿名函数使其立即执行,即正确代码中所显示的那样。

正确代码演示:

<script >
function makeClosures(arr,fn){
    var result=new Array(); 

     for(i=0;i<arr.length;i++){
      result[i]=function(num){
             return function(){
                 return fn(num);

           }
        }(arr[i]);
      }
  return  result;

}
}
</script>
var arr=[1,2,3];
var fn=function(y){
       return y*y;
 }
var t=makeClosures(arr,fn);
document.writeln(t[1]())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值