思路: 先定义一个空的数组,for循环遍历数组,把数组里面的元素push到空的数组中,因为返回的是回调函数,i值需要传递进去,函数里面返回一个函数,再返回函数的元素,最后把定义的数组返回出去;
1.闭包的使用(i值的传递)
function makeClosures(arr, fn) {
// 定义一个空的数组
var result = [];
for (var i = 0; i < arr.length; i++) {
// 添加到数组中
result.push((function(num){
// 返回一个函数(回调函数,i值需要传进来)
return function(){
// 返回其中的某一项
return fn(arr[num])
};
// 传i值进去
})(i));
}
// 把数组返回出去
return result;
}
2.用forEach方法直接返回数组的元素
function makeClosures(arr, fn) {
// 定义一个空的数组
var result = [];
// forEach 循环 (第一个参数是元素, 第二个参数是下标,第三个参数是原数组)
arr.forEach(function(ele) {
result.push(function(){
// 返回数组中的元素
return fn(ele);
});
})
// 返回空数组
return result;
}
3.用es6的语法
function makeClosures(arr, fn) {
// 定义一个空的数组
var result = [];
// let 有块级作用域(只在大括号里面有效)
for (let i = 0; i < arr.length; i++) {
result.push(function() {
// 返回数组中的元素
return fn(arr[i]);
});
}
// 返回数组出去
return result;
}