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;
}
function makeClosures(arr, fn) { var result = []; arr.forEach(function(e){ result.push(function(num){ return function(){ return fn(num); }; }(e)); }); return result; }