当读取热图代码时,我找到了像
这样的代码this._store.addData.apply(this._store, arguments);
我对'apply'的使用感到非常困惑。下面的代码中有任何不同
this._store.addData(arguments);
谢谢!
答案 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);