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 res = Array(); for (var i = 0; i < arr.length; i++) { res[i] = (function() { return fn(arr[i]); })(); //自啟動函數 } return res; }
function makeClosures(arr, fn) { let result = arr.map((item,index) => (function(index){ return fn(item) })) return result }
function makeClosures(arr, fn) { var arrFn = []; for(var i = 0; i < arr.length; i++){ var rel = fn(arr[i]); arrFn[i] = new Function('return ' + rel + ';'); } return arrFn; }
function makeClosures(arr, fn) { var result = new Array(); for(let i=0;i<arr.length;i++){ result[i] = function(){ return fn(arr[i]); //let声明的变量只在let所在代码块内有效,因此每次循环的i都是一个新的变量 }; } return result; }
//这种是错误的写***导致result中每个函数的参数都是arr[arr.length] function makeClosures(arr, fn) { var result = new Array(); for(var i=0;i<arr.length;i++){ result[i] = function(){ return fn(arr[i]); }; } return result; }
//参考《JavaScript高级程序设计》的典型方法 function makeClosures(arr, fn) { var result = new Array(); for(var i=0;i<arr.length;i++){ result[i] = function(num){ return function(){ return fn(num); } }(arr[i]); } return result; }
//使用ES5的bind()方法 function makeClosures(arr, fn) { var result = new Array(); for(var i=0;i<arr.length;i++){ result[i] = fn.bind(null,arr[i]); } return result; }
//使用forEach() function makeClosures(arr, fn) { var result = new Array(); arr.forEach(function(curr){ result.push(function(){return fn(curr)}); }) return result; }