使用闭包

来源:互联网 发布:演唱会抢票软件 编辑:程序博客网 时间:2024/05/22 15:31

题目描述
实现函数 makeClosures,调用之后满足如下条件:
1、返回一个函数数组 result,长度与 arr 相同
2、运行 result 中第 i 个函数,即 resulti,结果与 fn(arr[i]) 相同
输入例子:
var arr = [1, 2, 3];
var square = function (x) {
return x * x;
};
var funcs = makeClosures(arr, square);
funcs1;

输出例子:
4


题目亮点
function makeClosures(arr, fn) {
var result = new Array();
arr.forEach(function(item){
result.push(function(){
return fn(item);
})
})
return result;
}

简单的描述闭包:如果在函数func内部声明函数inner,然后在函数外部调用inner,这个过程即产生了一个闭包。
题目要求的是返回一个函数数组,如果在循环中直接写
result[i] = function(){return fn(arr[i]);}
或者
result.push(function(){return fn(arr[i]);}),
最终的结果是不正确的,因为在每次迭代的时候,那样的语句后面的方法并没有执行,只是创建了一个函数体为“return fn(arr[i]);”的函数对象而已,当迭代停止时,i为最终迭代停止的值,在函数被调用时,i依旧为最终迭代停止的值,因此无法返回正确的结果。
为了解决这个问题,需要声明一个匿名函数,并立即执行它。
function(num){return function(){return fn(arr[num]); }; }(i),函数执行后,i立即传入并被内部函数访问到,因此就能得到正确的结果。闭包允许你引用存在于外部函数中的变量。
下面的代码使用的是forEach循环

function makeClosures(arr, fn) {
var result = [];
arr.forEach(function(i){

             return fn(i);        ); }); return result;

}

方法二:ES6直接用let

function makeClosures(arr, fn) {
var result = new Array();
for(let i=0;i

0 0