我试图理解这个简单的代码片段
function fnWrapper (fn) {
return function printResults (...args) {
const results = args.map(fn)
console.log(results)
}
}
const squarePrinter = fnWrapper(x => x*x)
const cubePrinter = fnWrapper(x => x*x*x)
const nums = [1, 2]
squarePrinter(1, 2)
cubePrinter(1, 2)
虽然几乎所有内容都有意义,但我无法理解这一部分args.map(fn)
即map
应该提供一个元素,但是我们如何能够传递fn函数并直接获得所需结果
答案 0 :(得分:3)
map函数带有一个回调函数,该函数在每次迭代时与数组元素一起执行。
您可能会想到
之类的上述代码args.map((x) => x*x);
除了fn
作为参数提供的fnWrapper
地图的典型实现类似于
Array.prototype.map = function (callback) {
const resultArray = [];
for (let index = 0; index < this.length; index++) {
resultArray.push(callback(this[index], index, this));
}
return resultArray;
}
答案 1 :(得分:2)
根据map文档,它将回调函数作为参数并返回一个新数组,其中每个元素都是回调函数的结果。
例如
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
// Return element for new_array
}[, thisArg])
所以就您而言
squarePrinter(1, 2)
const results = args.map(fn)
等效于
const results = [1, 2].map(function(x) {
return x*x;
})
答案 2 :(得分:0)
Map
是一个higher order function,可以将回调函数作为参数,以简单的形式map()
实现如下:
Array.prototype.myMap = function(callback) {
arr = [];
for (let i = 0; i < this.length; i++)
//Map function take 3 parameter: the item, items's index and the array it self
arr.push(callback(this[i], i, this));
return arr;
};
答案 3 :(得分:0)
args.map(fn)将采用每个参数,并对这些参数执行操作以创建新列表。 更多喜欢
squarePrinter(1, 2) => [1,2].map(x => x*x)