遇到一个闭包的问题~

题目描述是这样的:

实现一个函数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]())

猜你喜欢

转载自blog.csdn.net/L_SS133/article/details/78128044
今日推荐