我已经看到它在代码中的表现有所不同,但是在常规()函数执行上执行(空白参数) .call / .apply是否有任何好处或理由。
这当然是一个过于简单的例子
var func = function () { /* do whatever */ };
func.call();
func.apply();
VERSUS只是简单的括号。
func();
在任何地方都没有看到任何关于此的信息,我知道为什么在传递参数时使用调用/应用。
我已经看到它在代码中的表现有所不同,但是在常规()函数执行上执行(空白参数) .call / .apply是否有任何好处或理由。
这当然是一个过于简单的例子
var func = function () { /* do whatever */ };
func.call();
func.apply();
VERSUS只是简单的括号。
func();
在任何地方都没有看到任何关于此的信息,我知道为什么在传递参数时使用调用/应用。
当您使用 调用方法时func();
,方法this
内的变量指向window
对象。
当您使用call(...) / apply(...)时,传递给方法调用的第一个参数变为方法this
内部。如果您没有传递任何参数/传递 null 或 undefined,那么this
将成为非严格模式下的全局对象。
是的,在某些情况下有一个重要的区别。例如,处理回调。假设您有一个带有构造函数的类,该类接受callback
参数并将其存储在this.callback
. 稍后,当通过调用此回调时this.callback()
,外部代码突然通过 获取对您的对象的引用this
。它并不总是可取的,this.callback.call()
在这种情况下使用会更好/更安全。
这样,外部代码将得到undefined
asthis
并且不会尝试意外修改您的对象。并且正确编写的回调不会受到这种用法的影响call()
,因为它们会提供定义为箭头函数或绑定函数(通过.bind()
)的回调。在这两种情况下,回调将有自己的,正确的 this,不受 影响call()
,因为箭头和绑定函数只是忽略由 设置的值apply()/call()
。