Javascript apply()params不匹配

时间:2014-07-12 23:01:14

标签: javascript jquery

我理解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]);
    }
}

2 个答案:

答案 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