我正在使用apply调用一个方法,我不知道我将传递多少个参数:
目前我的代码看起来像这样:
selectFolder: function(e){
e.preventDefault();
this.addSelectedClass.apply(this, Array.prototype.slice.call(arguments));
},
我使用Array.prototype.slice的唯一原因是因为它在大多数示例中。
为什么我不会像这样传递参数:
this.addSelectedClass.apply(this, arguments);
答案 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[, ...]]]);
我们可以使用其中任何一个来执行相同的功能。
使用apply()
时,我们可以立即传递所有参数。 slice()
通常用于省略调用中的特定参数或将arguments
转换为实际数组。
使用call()
时,我们会根据需要传递单个参数。如果我们提供转换为数组的参数,我们的被调用函数将获得一个类型为array的参数,并在该特定数组中提供所有参数。
我希望这更能解决问题。
答案 1 :(得分:3)
因为arguments
不是数组。运行Array.prototype.slice
会使其成为包含map
和forEach
等函数的常规数组。基本上是Array.prototype
中的任何内容。如果没有这个,arguments
只是一个length
属性的对象。
在您的特定情况下,仅传递arguments
可能会有效。