【问题标题】:.call() / .apply() with NO parameters VS simply calling a function with () parenthesis.call() / .apply() 没有参数 VS 简单地调用带有 () 括号的函数
【发布时间】:2013-03-31 23:48:16
【问题描述】:

我已经看到它在代码中的表现有所不同,但是与常规 () 函数执行。

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

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

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

VERSUS 只是简单的括号。

func();

在任何地方都没有看到这方面的任何信息,我知道为什么在传递参数时使用调用/应用。

【问题讨论】:

  • @FeistyMango:绝对不是骗人的。
  • 你在哪里见过这样的代码?我认为(并回答)这是为了确保this 为空,但事实并非如此。据我通过一些快速实验得知,这是一种毫无意义的做法。
  • 当然可以。他正在询问致电与申请的好处/原因。这不是和问两者的区别本质上一样吗???
  • 不,他在问为什么使用 .call.apply 而不使用 this 参数而不是简单地调用函数。
  • @FeistyMango 我将 2 放在同一类别中,我更多地关注为什么有人会做一个空白参数 funcName.call(); 而不是 funcName();

标签: javascript function closures


【解决方案1】:

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

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

【讨论】:

  • 不,this 仍将指向全局对象,除非您明确地将 undefined 作为第一个参数传递。
  • Bart 是正确的——事实上this 将是window,即使你明确地传递了nullundefined。在“严格”模式下它可以工作,但只是简单的func() 也会将this 设置为undefined
  • 哇,很有趣,知道了绝对好!所以也许我看到的一些代码(希望我现在能找到一个例子)是在严格模式下打算它是未定义的,不知道他们为什么想要那个..
  • 再一次,如果你在严格模式下,this 也不会引用全局对象,如果进行了简单的 func() 调用。因此,即使在严格模式下,我也看不出有任何理由在没有 this 参数的情况下使用 func.call()
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-03-31
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2012-07-17
    • 2019-01-15
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多