【问题标题】:Purpose of this idiom in JavaScript这个成语在 JavaScript 中的用途
【发布时间】:2015-05-04 10:22:39
【问题描述】:

以下成语的目的可能是什么?

Function.apply.call(fn, console, args);

我以前从未见过 apply 被“调用”。

【问题讨论】:

  • Function这里是实际功能的占位符,还是您在谈论实际的Function constructor
  • @epascarello 我认为问题在于apply call 一起使用,而不是apply 是什么
  • 我错过了call(),早上的咖啡还没有开始。
  • 更多信息和讨论请关注this related question

标签: javascript


【解决方案1】:

要调用函数,我们需要'function'、'this'和'arguments'。

单独使用Function.applyFunction.call 可以让您指定“this”和“arguments”,但不能指定要调用的函数,因为它们使用自己的this 作为函数,所以我们需要一个额外的层来设置它'this' 值。

你可以说:

fn.apply(console, args);

但如果 fn.apply 已被覆盖,这将不起作用。

【讨论】:

    【解决方案2】:

    这当然不是惯用的 :-) 让我们看看它的作用:

    • Function.applyFunction.prototype.apply 方法 - Function constructor 继承它。
    • 此方法获取.calledfn 作为this 值,console 作为第一个参数,args 作为第二个参数。

    所以这应该等价于fn.apply(console, args),它在带有动态args 列表的console 对象上调用fn(可能是console 方法)。

    那么为什么要这样做呢?因为Function.apply.call(fn, console, args) 不完全等同于fn.apply(console, args)!只有当fn.apply === Function.apply 时,情况可能并非如此。
    不太可能有人会覆盖 .apply 属性 - 如果他这样做是他的错 - 但有一个现实世界的问题:fn 不继承自 Function.prototype 的对象即使它们是可调用的.这可能发生在宿主对象的错误实现中;最著名的例子是Internet Explorer's console object

    【讨论】:

      猜你喜欢
      • 2022-12-04
      • 2017-05-19
      • 2014-01-02
      • 2012-07-26
      • 2011-08-08
      • 1970-01-01
      • 2013-07-20
      • 2016-11-06
      • 1970-01-01
      相关资源
      最近更新 更多