有人请解释一下Function.apply.bind(Math.max,null)算法

时间:2017-09-19 22:47:36

标签: javascript

假设我们有这个代码

function largestOfFour(arr) {
  return arr.map(Function.apply.bind(Math.max, null));
}

其中arr是一个数组数组。

  1. 首先,为什么我必须使用apply()?
  2. 据我所知,当使用Math.max()方法对数组进行操作时,我必须添加apply()方法。所以我会有这样的事情Math.max.apply(null, arr)为什么? apply()有什么用?

    1. 在这段代码中arr.map(Function.apply.bind(Math.max, null)) bind()真正做了什么?
    2. 请给出一个我能理解的解释,我真的很感激。

3 个答案:

答案 0 :(得分:4)

查看整个表达式:

arr.map(Function.apply.bind(Math.max, null));

map 期望它的第一个参数是一个函数,它由:

返回
Function.apply.bind(Math.max, null);

Function.apply Function.prototype.apply 的缩写版。

在其上调用 bind 会返回 apply 的特殊版本,其设置为 Math.max ,当被调用时,它将具有设置为 null 的第一个参数(即通常用作的值),因为它不是将被使用。

因此, arr 中的每个元素都将使用:

进行有效调用
Math.max.apply(null, member);

使用 apply 表示成员中的值作为参数传递,如下所示:

Math.max(member[0],member[1] ... member[n]); 

因此表达式返回每个数组中的最大值。这些值将返回到 map ,这会将它们放入一个新数组中。



var arr = [[1,2,3],[4,5,6]];
console.log(
  arr.map(Function.apply.bind(Math.max, null)) //[3, 6]
);




并且实际上与:

相同



var arr = [[1, 2, 3],[4, 5, 6]];
console.log(
  arr.map(function(a) {return Math.max.apply(null, a)}) //[3, 6]
);




虽然使用最近的功能,但您可以使用rest参数语法进行破坏:



var arr = [[1, 2, 3],[4, 5, 6]];
console.log(
  arr.map(a => Math.max(...a))   // [3, 6]
);




答案 1 :(得分:1)

简而言之,.apply调用一个函数,并将一组参数(类似数组)传递给它。

EG:

const add = (...args) => args.reduce((acc, next) => acc + next);

我可以使用add方法使用任意数量的参数调用.apply函数。

add.apply(null, [4, 2, 6, 76, 9]) // => 97.

你也可以使用.call但不是传递类似数组的参数,而只是传入值

add.call(null, 4, 2, 6, 76, 9) // => 97.

使用.bind,不同之处在于它创建了一个新函数,稍后会调用call。

const addFunc = add.bind(null, 4, 2, 6, 76, 9);
addFunc() // -> 97.

因此,它适用于我们定义的函数,它也适用于Math.maxMath.min等内部函数。

希望这有帮助!

答案 2 :(得分:1)

Function.apply.bind(Math.max, null)在调用时创建一个函数定义,默认情况下将null作为第一个参数,任何提供的参数都将排在第二位。因此,回调arr.map此函数(由于bind语句)将绑定到Math.max,但Function.apply的第一个参数将为null并且第二个是主数组的子数组项(其中的项将作为参数传递给Math.max函数)。

这是一个老技巧,在ES6条款中,arr.map(s => Math.max(...s));可以更清楚地完成同样的工作。