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; }