.call()/。apply()与NO参数VS简单地用()括号调用函数

时间:2013-04-09 13:51:15

标签: javascript function closures

我已经看到它在代码中做了不同的做法,但是对于常规()<做一个(空白参数) .call / .apply 是否有任何好处或理由/ strong>功能执行。

这当然是一个过于简化的例子

var func = function () { /* do whatever */ };

func.call();
func.apply();

VERSUS 只是简单的括号。

func();

在任何地方都没有看到任何关于此的信息,我知道为什么在传递params时会使用call / apply。

2 个答案:

答案 0 :(得分:6)

当您使用func();调用方法时,方法内的this变量指向window对象。

当您使用call(...) / apply(...)时,传递给方法调用的第一个参数在方法内变为this。如果你没有传递任何参数/传递null或undefined,那么thisbecome global object在非严格模式下。

答案 1 :(得分:0)

是的,在某些情况下存在重要区别。例如,处理回调。假设您有一个带有构造函数的类,该类接受callback参数并将其存储在this.callback下。稍后,当通过this.callback()调用此回调时,外来代码突然通过this获取对您对象的引用。并非总是如此,在这种情况下使用this.callback.call()更好/更安全。

这样,外来代码将undefined设为this,并且不会尝试偶然修改您的对象。正确编写的回调无论如何都不会受到call()的这种使用的影响,因为它们将提供定义为箭头函数或绑定函数的回调(通过.bind())。在这两种情况下,回调都将拥有自己的,适当的设置,不受call()的影响,因为箭头和绑定函数只是忽略由apply()/call()设置的值。