我看到一些代码中使用了不同的方式,但是使用空参数的.call / .apply与普通的()函数执行相比有什么好处或原因呢?
当然,这只是一个过于简化的例子。
var func = function () { /* do whatever */ };
func.call();
func.apply();
与普通的圆括号相比,VERSUS 更加复杂。
func();
我在任何地方都没有看到关于这个的信息,我知道为什么要在传递参数时使用call/apply。
我看到一些代码中使用了不同的方式,但是使用空参数的.call / .apply与普通的()函数执行相比有什么好处或原因呢?
当然,这只是一个过于简化的例子。
var func = function () { /* do whatever */ };
func.call();
func.apply();
func();
我在任何地方都没有看到关于这个的信息,我知道为什么要在传递参数时使用call/apply。
func();
调用方法时,方法内部的this
变量指向window
对象。this
。如果您未传递任何参数/传递null或undefined,则this
将在非严格模式下变成全局对象。this
仍然会指向全局对象,除非你明确将 undefined
作为第一个参数传递。 - Bartthis
也将是window
。在“严格”模式下它可以工作,但是然后只有普通的func()
也会将this
设置为undefined
。 - Pointythis
也不会引用全局对象。因此,即使在严格模式下,我也看不到使用没有this
参数的func.call()
的任何理由。 - Bart是的,在某些情况下有重要的区别。例如,处理回调函数。假设您有一个带有构造函数的类,该构造函数接受callback
参数并将其存储在this.callback
下。稍后,当通过this.callback()
调用此回调时,外部代码会通过this
获得对您的对象的引用。这并不总是可取的,最好/更安全的方法是在这种情况下使用this.callback.call()
。
这样,外部代码将获取undefined
作为this
,并且不会意外地尝试修改您的对象。而正确编写的回调无论如何都不会受到call()
的影响,因为它们会提供定义为箭头函数或通过.bind()
绑定函数的回调。在这两种情况下,回调都将具有自己的适当的this,并且不受apply()/call()
设置的值的影响,因为箭头和绑定函数只忽略这个值。
this
为空,但事实并非如此。通过一些快速实验,据我所知,这是一个毫无意义的做法。 - Pointythis
参数的.call
或.apply
与直接调用函数的原因。 - BartfuncName.call();
而不是funcName();
。 - Mark Pieszak - Trilon.io.call()
或.apply()
中的任意一个而不带参数,而不是直接调用函数。 - Pointy