为什么将Array.prototype.slice.call与参数一起使用

时间:2012-08-20 15:00:00

标签: javascript

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

目前我的代码看起来像这样:

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

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

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

为什么我不会像这样传递参数:

 this.addSelectedClass.apply(this, arguments);

2 个答案:

答案 0 :(得分:6)

带有arguments

apply()很好

在函数上调用apply时,只需使用原始arguments即可。在您的示例中,您可以轻松地用以下内容替换该行:

this.addSelectedClass.apply(this, arguments);
带有arguments

call()不合适

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

arguments 不是实际的数组对象。它们似乎是(例如具有length属性),但它们不是。

Arguments on Mozilla Deveveloper Network

使其完全清楚的一些解释

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

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

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

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

  2. 使用call()时,我们会根据需要传递单个参数。如果我们提供转换为数组的参数,我们的被调用函数将获得一个类型为array的参数,并在该特定数组中提供所有参数。

  3. 我希望这更能解决问题。

答案 1 :(得分:3)

因为arguments不是数组。运行Array.prototype.slice会使其成为包含mapforEach等函数的常规数组。基本上是Array.prototype中的任何内容。如果没有这个,arguments只是一个length属性的对象。

在您的特定情况下,仅传递arguments可能会有效。