如何在javascript中使用apply()

时间:2014-12-19 01:21:25

标签: javascript

当读取热图代码时,我找到了像

这样的代码
this._store.addData.apply(this._store, arguments);

我对'apply'的使用感到非常困惑。下面的代码中有任何不同

this._store.addData(arguments);

谢谢!

2 个答案:

答案 0 :(得分:2)

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

this._store.addData(arguments[0], arguments[1], ..)

如果arguments的长度未知,那么这显然很麻烦 再次传递this._store只是必要的,这不是此代码的重点。

答案 1 :(得分:0)

两者不一样。

.apply() as documented here on MDN,在执行函数时设置this的值,并将一个参数数组传递给该函数,该函数将扩展为普通函数参数。

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

例如,如果参数伪数组中有三个项目,那么第一个选项会像这样调用你的函数:

this._store.addData(arg1, arg2, arg3);

而且,你的第二个代码块会像这样调用它:

this._store.addData([arg1, arg2, arg3]);

虽然从技术上讲,它甚至没有传递数组,但它传递的伪数组实际上并没有数组方法。


使用.apply()的原因是当你有一个数组或类数组结构中的参数列表,并且你想使用该参数列表作为函数的参数调用一个函数(传递给作为正常参数起作用)。当你想要将参数从一个函数转发到下一个函数或者想要修改参数时(例如删除一个或更改一个参数)然后用其他所有参数调用另一个函数时,它常用。

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

作为必然结果,当您确切地知道有多少个参数时使用.call()(例如,您知道有两个参数并且您想要控制this指针或.call()是通常在你只想控制this指针并且没有任何参数时使用。.apply()的一个优点是你不必知道有多少参数 - 你可以传递任何参数(这就是为什么它在将args从一个函数转发到下一个函数时特别有用),比如在调用基类构造函数时或代理函数时如何{ {1}}确实。


这两个方法中的.bind()指针是相同的,因为调用this会将obj.method()的值设置为this,在两种情况下都是obj this._store 1}}。

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

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