如何在javascript中使用apply()

如何在javascript中使用apply(),javascript,Javascript,阅读热图代码时,我发现代码如下 this._store.addData.apply(this._store, arguments); 我对“apply”的用法感到非常困惑。下面的代码有什么不同吗 this._store.addData(arguments); 谢谢 这两者不一样 .apply(),设置执行函数时此的值,并将参数数组传递给该函数,该函数将扩展为普通函数参数 第二个代码示例将类似数组的参数对象传递给实际函数,而不是扩展的参数列表,因此它们不同 例如,如果arguments伪数组中

阅读热图代码时,我发现代码如下

this._store.addData.apply(this._store, arguments);
我对“apply”的用法感到非常困惑。下面的代码有什么不同吗

this._store.addData(arguments);

谢谢

这两者不一样

.apply()
,设置执行函数时此的值,并将参数数组传递给该函数,该函数将扩展为普通函数参数

第二个代码示例将类似数组的参数对象传递给实际函数,而不是扩展的参数列表,因此它们不同

例如,如果arguments伪数组中有三项,那么第一个选项将如下调用函数:

this._store.addData(arg1, arg2, arg3);
this._store.addData([arg1, arg2, arg3]);
第二个代码块将这样调用它:

this._store.addData(arg1, arg2, arg3);
this._store.addData([arg1, arg2, arg3]);
虽然从技术上讲,它甚至不传递数组,而是传递一个实际上没有数组方法的伪数组


使用
.apply()
的原因是,在数组或类似数组的结构中有一个参数列表,并且希望使用该参数列表作为函数的参数(作为普通参数传递给函数)调用函数。当您只想将参数从一个函数转发到下一个函数时,或者当您想修改参数(例如,删除或更改一个参数),然后调用另一个函数和所有其他参数时,通常会使用此函数

或者有时
.apply()
仅用于控制
指针,不传递任何参数(尽管
.call()
也可以这样做)

作为推论,
.call()
在您确切知道有多少个参数时使用(例如,您知道有两个参数,并且您想要控制
this
指针或
。call()
通常在您只想控制
this
指针而没有任何参数时使用。
的一个优点是应用()
就是你不必知道有多少个参数——你只需要传递任何参数(这就是为什么它在将参数从一个函数转发到下一个函数时特别有用),比如调用基类构造函数或者代理一个函数,比如
.bind()
所做的


指针在这两种方法中是相同的,因为调用
obj.method()
的值设置为
obj
,在这两种情况下都是
This.\u store

请注意,这两者是相同的:

this._store.addData(arguments);   
this._store.addData.call(this._store, arguments);

这里使用
.apply
的要点是函数参数显然在数组
参数中。没有
.apply
的等效代码是:

this._store.addData(arguments[0], arguments[1], ..)
如果
参数的长度未知,这显然很麻烦。

再次传递
这个。_store
只是必要的,这不是这个代码的重点。

没有理由有多个相同的答案,所以放弃我的答案和+1(即使我是第一个!;-p)