首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由.apply()执行的函数适用于数组,但不适用于原始函数

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

Stack Overflow用户
提问于 2013-07-22 03:57:15
回答 3查看 700关注 0票数 0

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

代码语言:javascript
复制
function getMaxOfArray(numArray) {
 return Math.max.apply(null, numArray);
}

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-22 03:59:31

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

代码语言:javascript
复制
Math.max.apply(null,[1,3,9])
Math.max.call(null,1,3,9)

What is the difference between call and apply?详细介绍了callapply之间的区别

票数 3
EN

Stack Overflow用户

发布于 2013-07-22 03:59:05

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

代码语言:javascript
复制
Math.max.apply(null, [1, 3, 9]);
Math.max.call(null, 1, 3, 9);

对于函数,如果不希望用户传递数组,则可以将arguments对象用于可变数量的参数。下面是你该怎么做的。(请注意,我在这里仍然调用apply,因为我将用户调用的所有参数存储到一个数组中。)

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

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

代码语言:javascript
复制
getMaxOfArguments(1, 3, 9); // 9
票数 2
EN

Stack Overflow用户

发布于 2013-07-22 04:04:19

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17776301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档