Javascript apply如何处理采用逗号分隔参数的函数?

Javascript apply如何处理采用逗号分隔参数的函数?,javascript,arrays,csv,push,apply,Javascript,Arrays,Csv,Push,Apply,好的,所以我理解如果你这样做: Array.prototype.push.apply([1, 2], [3, 4]) 它基本上会连接apply中的第一个数组: [1, 2, 3, 4] 这背后的假设逻辑是[1,2]被设置为这个对象,在这个对象上,push将被[3,4]调用 如果我们说apply是: fun.apply(thisArg, [argsArray]) 然后fun是push,这个arg是[1,2],[argsArray]是[3,4] 所以对我来说,这几乎相当于: [1, 2].pu

好的,所以我理解如果你这样做:

Array.prototype.push.apply([1, 2], [3, 4])
它基本上会连接apply中的第一个数组:

[1, 2, 3, 4]
这背后的假设逻辑是[1,2]被设置为这个对象,在这个对象上,push将被[3,4]调用

如果我们说apply是:

fun.apply(thisArg, [argsArray])
然后funpush这个arg[1,2][argsArray][3,4]

所以对我来说,这几乎相当于:

[1, 2].push([3, 4])
但是,push接受逗号分隔的值,而不是数组或类似数组的对象。应用程序是如何实现这一点的

根据这一点:,可以使用apply调用接受逗号分隔值的任何其他函数,以执行类似于上面示例的操作,例如:

var max = Math.max.apply(null, [1, 2, 3, 4, 5, 6, 7]); //max = 7
不幸的是,没有任何解释


apply如何处理采用逗号分隔参数的函数

Function.prototype.apply
通过将第二个参数(必须是数组或类似数组)的每个元素作为单个参数传递给函数来调用指定函数

因此,您在第一个示例中所做的与

[1, 2].push(3, 4);
它不等同于调用
[1,2].push([3,4])如果是,则结果将是一个数组,其中嵌套了另一个数组:

[1, 2, [3, 4]]
有一种方法可以实现您认为
apply
正在做的事情。它叫
call

Array.prototype.push.call([1, 2], [3, 4]);

Function.prototype.apply(thisArg[argsArray])
thisArg
作为第一个必需的参数,并将可选的第二个参数作为数组

它使用指定的
thisArg
和可选的
argsArray
数组返回调用函数的结果

但是等等,第二个参数是一个类似数组的对象,但是它指定了调用函数的参数

因此,对于您的示例
Array.prototype.push.apply([1,2],[3,4])
,调用函数是
push
,它接受可变数量的参数并将其推入
数组和
参考数组
[1,2]
。所以这个例子的工作原理是

[1, 2].push(3, 4) // output: [1, 2, 3, 4]
但是,

对于第二个示例,
Math.max.apply(null[1,2,3,4,5,6,7])
由于调用的是
Math
的原型函数,因此
thisArg
null
。它不允许外部
执行任何任务。因此,该示例的工作原理如下:

Math.max(1, 2, 3, 4, 5, 6, 7) // output: 7

我希望它能帮助您。

我知道它基本上与您提供的第一个示例一样工作。我只是没有看到任何文档说明它会将参数列表转换为逗号分隔的值,以输入push函数。这是Javascript内部所做的事情?我想要一个更具体的解释。你没有找到任何文档说明这一点,因为“逗号分隔值”不是正确的术语。它将数组的元素作为单独的参数传递。这就是函数的第一行所说的:
apply()
方法使用给定的
this
值和作为数组提供的参数调用函数。我不知道它在内部是如何工作的,但这就是它设计的工作方式。如果你的问题是关于
apply()
如何在内部工作的,那将是一个特定于实现的问题,每个JavaScript实现的答案可能都不一样。好的,我想现在就明白了。我被MDN文档中的那一行弄糊涂了,直到我看到“arguments”实际上是arguments对象,对吗?那么,它是否真的在做这样的事情:
[1,2].push(参数[0],参数[1])
?不,参数只是通常在括号之间传递到函数中的东西。这与arguments对象不同。
Math.max(1, 2, 3, 4, 5, 6, 7) // output: 7