我理解JavaScript apply()将第二个param视为应用于其的fn的数组参数arg。 但是在下面的当前代码片段中,项目arg是[1,2]而不是[[1,2],6,7,8,9]
有人可以向我解释为什么会这样吗?
var orig = [1, 2],
add = [6,7,8,9];
prependArgs.apply(orig, $.merge([orig], add.slice(0)));
function prependArgs(item) {
// item = [1,2] instead of [[1,2], 6,7,8,9] -- Why?
var a = item.slice(0);
for (var i = 0; i < a.length; i++) {
this.unshift(item[i]);
}
}
答案 0 :(得分:1)
$.merge
的结果是[Array[2], 6, 7, 8, 9]
function.apply()
获取一系列项目,并将其划分为多个单独的参数 - 一个用于数组的每个元素。因此,第一个参数item
是[1,2],因为这是您传递的数组的第一个元素。
apply()确实接受了其余的元素并将它们作为附加参数传递,您可以通过将您的函数声明为prependArgs(item,item2,item3,item4等等)来实现,或者通过这样做:
function prependArgs(item) {
console.log(arguments) // prints [Array[2], 6, 7, 8, 9]
}
function.call()
会将整个数组作为单个参数item
传递而不会将其拆分。
答案 1 :(得分:0)
要使用apply()
调用函数内的整个数组,请尝试使用
var orig = [1, 2],
add = [6,7,8,9];
prependArgs.apply(orig, [$.merge([orig], add)]);
function prependArgs(item) {
console.log(item) //--- this prints [[1, 2], 6, 7, 8, 9]
var a = item.slice(0);
for (var i = 0; i < a.length; i++) {
this.unshift(item[i]);
}
}
如评论中所指出的,如果你想使用apply()
,你需要传递一个数组作为第二个参数,请参阅文档here