5

我正在使用 apply 调用一个方法,但我不知道我将传递多少个参数:

目前我的代码如下所示:

selectFolder: function(e){
  e.preventDefault();

  this.addSelectedClass.apply(this, Array.prototype.slice.call(arguments));
},

我使用 Array.prototype.slice 的唯一原因是因为它在大多数示例中。

为什么我不只是传递这样的参数:

 this.addSelectedClass.apply(this, arguments);
4

2 回答 2

6

argumentsapply()很好_

调用apply函数时,只需使用 original 即可arguments。所以在你的例子中,你可以很容易地用这个替换这一行:

this.addSelectedClass.apply(this, arguments);

argumentscall()不好

但是,如果您要调用,那么如果您想向函数传递任意对象/值的数组,call则应该转换arguments为实际数组(通过调用完成)。slice()这就是为什么call()通常在您确切知道要传递的参数数量并单独传递它们时使用的原因。

arguments不是实际的数组对象。他们似乎是(length例如拥有财产),但事实并非如此。

关于 Mozilla 开发者网络的争论

一点解释,以使其完全清楚

apply()相关文档call()如下所示:

func.apply(thisArg[, argsArray]);
func.call(thisArg[, arg1[, arg2[, ...]]]);

我们可以使用其中任何一个来执行相同的功能。

  1. 使用时,apply()我们可以一次传递所有参数。slice()通常用于省略调用中的特定参数或转换arguments为实际数组。

  2. 使用时,call()我们传递单独的参数和我们需要的尽可能多的参数。如果我们将提供转换为数组的参数,我们被调用的函数将获得一个数组类型的参数,其中所有参数都在该特定数组中提供。

我希望这能更清楚地说明问题。

于 2012-08-20T15:06:03.340 回答
3

因为arguments不是数组。运行Array.prototype.slice使它成为一个普通数组,其中包含 和 之类的map函数forEach。基本上任何东西都在Array.prototype. arguments是,没有这个,只是一个具有length属性的对象。

在您的特定情况下,通过arguments可能会起作用。

于 2012-08-20T15:01:24.893 回答