好吧,如果你这样做我就明白了。
Array.prototype.push.apply([1, 2], [3, 4])
它基本上会把apply中的第一个数组连接起来:
[1, 2, 3, 4]
这背后的逻辑是 [1, 2] 被设置为... 这个 对象上,将用[3,4]调用push。
如果我们说应用是。
fun.apply(thisArg, [argsArray])
那么 趣味 是 推动, 这个Arg 是 [1, 2] 和 [argsArray] 是 [3, 4]
所以,对我来说,这几乎等同于。
[1, 2].push([3, 4])
但是,"推 "需要的是 逗号分隔的值 而非 阵列 或 阵列式 对象。apply是如何实现的呢?
根据这个。http:/rusticode.com20120815javascript-call-and-apply。任何其他接受逗号分隔值的函数都可以用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
的参数,并将其推送至 this
阵列和 this
指数组 [1, 2]
. 所以这个例子的工作原理是
[1, 2].push(3, 4) // output: [1, 2, 3, 4]
但是..,
[1, 2].push([3, 4]) // output: [1, 2, [3, 4]]
对于你的第二个例子。Math.max.apply(null, [1, 2, 3, 4, 5, 6, 7]);
的 thisArg
是 null
因为你调用的是 Math
. 这不允许外部 this
来执行任何任务。所以这个例子的工作原理是这样的。
Math.max(1, 2, 3, 4, 5, 6, 7) // output: 7
希望对你有帮助