传递地图功能

时间:2019-07-12 06:05:12

标签: javascript

我试图理解这个简单的代码片段

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函数并直接获得所需结果

4 个答案:

答案 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)