0

我遇到了 Function.prototype.apply 方法的问题。以下是我的测试源:

function callMe(array){
    var s = "";
    s += array; //<--- I want to access the array's member here, eg. array[0], array[1], ...
    return s;
}
var myArr = ["begin", 1, 2, 3, 4, "end"];
console.log(callMe.apply(this, myArr));

我想访问参数,但不想将函数调用中的每个参数指定为callMe.call(this, arg1, arg2, arg3). 我想要的是callMe.apply(this, [arg1, arg2, arg3]),然后,在被调用的函数中,我将访问参数:

array[0] = "yeah";
array[1] = 200;
array[2] = 150;
array[3] = "fine";

上面代码的输出只是“开始”,而我希望它是["begin", 1, 2, 3, 4, "end"]. 这里有什么问题?因为据我所知,Function.prototype.apply方法与单独的参数 as 一起使用callMe.apply(this, arrayOfArguments),这不起作用。然而,该方法call()运行良好。例如。在上面的示例中,我只是将 apply 方法替换为 call 方法,它返回的正是我想要的。我做错了什么?我想使用 apply 方法,而不是 call 方法。

4

1 回答 1

0

那是因为Function.prototype.apply有两个参数。第二个参数是一个参数数组,因此您的代码正在执行以下操作:

function callMe(array){
    var s = "";
    s += array;
    return s;
}
var myArr = ["begin", 1, 2, 3, 4, "end"];
callMe.apply(this, myArr); //SAME AS callMe(myArr[0],myArr[1],myArr[2],myArr[3],myArr[4],myArr[5]);

所以callMe.apply(this, myArr)在这种情况下是一样的callMe(myArr[0])

你必须做这样的事情:

callMe.apply(this, [myArr]);

或者像以前的答案(ft1)一样。

于 2013-08-05T10:41:09.357 回答