由.apply()执行的函数适用于数组,但不适用于原始函数

时间:2013-07-21 19:57:15

标签: javascript

如果Math.max([1,3,9])返回错误(需要一个数字列表,而不是一个数组),为什么通过下面的应用调用它有效?

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

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

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

3 个答案:

答案 0 :(得分:3)

apply期望参数在数组中。如果您只是在第二种情况下使用参数列表,请使用call代替

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

What is the difference between call and apply?详细介绍了callapply

之间的区别

答案 1 :(得分: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

答案 2 :(得分:0)

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

相关问题