思路: 先定義一個空的數組,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;
}