假设我们有这个代码
function largestOfFour(arr) {
return arr.map(Function.apply.bind(Math.max, null));
}
其中arr是一个数组数组。
据我所知,当使用Math.max()方法对数组进行操作时,我必须添加apply()方法。所以我会有这样的事情Math.max.apply(null, arr)
为什么? apply()有什么用?
arr.map(Function.apply.bind(Math.max, null))
bind()真正做了什么?请给出一个我能理解的解释,我真的很感激。
答案 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.max
,Math.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));
可以更清楚地完成同样的工作。