1、返回一个函数数组 result,长度与 arr 相同
  2、运行 result 中第 i 个函数,即 result[i](),结果与 fn(arr[i]) 相同 
 var arr = [1,2,3]; 
var fn = function (x) { 
    return x * x; 
}
var result = makeClosures(arr,fn);
(result[1]() === 4) === (fn(arr[1]) === 4) === true
                                        var arr = [1,2,3]; 
var fn = function (x) { 
    return x * x; 
}
var result = makeClosures(arr,fn);
(result[1]() === 4) === (fn(arr[1]) === 4) === true
                                        function makeClosures(arr, fn) {
    var result = [];
    for(var i = 0; i < arr.length; i++) {
        result[i] = function(ele) {
            return function() {
                return fn(ele);
            }
        }(arr[i]);
    }
    return result;
} forEach: function makeClosures(arr, fn) {
    var result = [];
    arr.forEach((item,index) => {
        result[index] = function(ele) {
            return function() {
                return fn(ele);
            }
        }(item);
    })
    return result;
} var makeClosures = (arr, fn) => arr.map((v) => () => fn(v));
function makeClosures(arr, fn) {   
    var result =[];
    //let 声明的变量只在 let 命令所在的代码块 {} 内有效,块级作用域
    for(let i = 0; i < arr.length; i++){
        result[i] = function(){
            return fn(arr[i]);        
        };
    }
    return result;
}
function makeClosures(arr,fn){
    var result = [];
    //array.forEach(function(currentValue, index, arr), thisValue)
    //forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数
    //参数1:必需。当前元素,
    //参数2:可选。当前元素的索引值
    //参数3:可选。当前元素所属的数组对象
    arr.forEach(function(num){
        result.push(function(){
            return fn(num);
        })
    })
    return result;
} var result = [];
for (let i = 0; i < arr.length; i++) {
    result[i] = function () {
        return fn(arr[i]);
    };
}
return result;var result = [];
for (var i = 0; i < arr.length; i++) {
    (function (i) {
        result[i] = function () {
            return fn(arr[i]);
        };
    })(i);
}
return result;var result = [];
arr.forEach(function (item) {
    result.push(function () {
        return fn(item);
    });
});
return result;var result = [];
function makeFnCallback(i){
    return function(){
        return fn(arr[i]);
    }
}
for(var i = 0; i < arr.length; i++){
    result[i] = makeFnCallback(i);
}
return result;//看到一位同学的回答,精简了自己的代码
function makeClosures(arr, fn) {
    return arr.map(function(curr){
        return function(){
            return fn.call(null, curr);
        };
    })
}
//当然使用bind也可以做到的,这样就不用使用匿名函数包裹了
function makeClosures(arr, fn) {
    return arr.map(function(curr){
        return fn.bind(null, curr);
    });
} 一开始的答案是这样的。
function makeClosures(arr, fn) {
    var result=[];
    for(var i=0;i<arr.length;i++){
        var fs=function(){
            return fn(arr[i])
        }
        result.push(fs);
    }
    return result;
}
var funcs = makeClosures(arr, square); 
funcs[1]();==>NaN
结果调用结果数组里的每个函数返回值为NaN.
后来发现是闭包里的arr[i]的问题,在for循环结束后返回的result里函数fs保存的变量arr[i]都成了arr[arr.length],而这个量是超出数组长度的。也就是说fs函数未能成功保存arr[i]的值,解决的办法如下。
function makeClosures(arr, fn) {
    var result=[];
    for(var i=0;i<arr.length;i++){
        (function(temp){
             var fs=function(){
                return fn(temp)
            };
            result.push(fs);           
        })(arr[i]);
    }
    return result;
}
function makeClosures(arr, fn) { var result = []; arr.forEach(function(e){ result.push(function(num){ return function(){ return fn(num); }; }(e)); }); return result; }