如何在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)