0

如果 Math.max([1,3,9]) 返回错误(需要数字列表,而不是数组),为什么像下面这样通过 apply 调用它?

function getMaxOfArray(numArray) {
 return Math.max.apply(null, numArray);
}

getMaxOfArray([1,3,9]) //9 
getMaxOfArray(1,3,9) //error

我知道 .apply 传递了一个数组,但是为什么 max 函数只有在通过 apply 调用时才能与它们一起使用?是否有一些内部转换数组 => 列表?

4

3 回答 3

3

apply期望参数在一个数组中。如果您只有在第二种情况下的参数列表,请call改用

Math.max.apply(null,[1,3,9])
Math.max.call(null,1,3,9)

call 和 apply 和有什么不一样?call详细介绍了和之间的区别apply

于 2013-07-21T19:59:31.303 回答
2

你的函数只接受一个参数 ( numArray),而不是三个——这就是你调用getMaxOfArray失败的原因。如果您正在编写单行代码,则应该使用call而不是apply一系列参数而不是数组,如下所示:

Math.max.apply(null, [1, 3, 9]);
Math.max.call(null, 1, 3, 9);

对于函数,arguments如果不希望用户传递数组,则可以使用对象获取可变数量的参数。以下是您将如何以这种方式进行操作。(请注意,我仍然apply在这里调用,因为我将用户调用的所有参数存储到一个数组中。)

function getMaxOfArguments() {
   var parameters = 1 <= arguments.length ? [].slice.call(arguments, 0) : [];
   return Math.max.apply(null, parameters);
}

现在,您的第二个函数调用应该可以工作了:

getMaxOfArguments(1, 3, 9); // 9
于 2013-07-21T19:59:04.963 回答
0

Math.max 的函数签名是 function(arg1, arg2, arg3, ...) 而不是 function(Array)。Apply 将输入转换为更适合 Math.max 的形式。

于 2013-07-21T20:04:18.580 回答