【问题标题】:Why should I call Function.prototype.apply.call(x, ...) instead of x.apply(...)?为什么我应该调用 Function.prototype.apply.call(x, ...) 而不是 x.apply(...)?
【发布时间】:2019-03-25 15:34:38
【问题描述】:

The doc page of Reflect.apply() 在 MDN 网络文档中指出:

在 ES5 中,您通常使用 Function.prototype.apply() 方法 使用给定的 this 值和作为参数提供的参数调用函数 数组(或类似数组的对象)。 Function.prototype.apply.call(Math.floor, undefined, [1.75]);

使用Reflect.apply,这变得不那么冗长,更容易理解。

我很困惑。在 ES5 中,我通常使用(保留上面的示例):

Math.floor.call(undefined, [1.75]);

为什么有人要改用:

Function.prototype.apply.call(Math.floor, undefined, [1.75]);


P.S.:我的问题不是关于Reflect.apply(myFunction, myObject, args);

【问题讨论】:

  • @LeroyStav - 相似,但绝对不同,这是比较Function.prototype.appyReflect.apply,上面询问Function.prototype.applysomeFunction.apply。 (不过,如果有直接的欺骗目标,我不会感到惊讶......)
  • @T.J.Crowder,但公认的答案确实涵盖了特定的子问题。当涉及到这样的问题时,获得更多的背景信息总是很有价值的。所以是的,你是完全正确的,因为问题并不相同,但在我看来,“可能重复”问题的公认答案涵盖了所有基础,不是吗?
  • @LeroyStav - 如果是,它会,是的;只要其他问题的答案回答了这个问题,SO 并不要求问题完全相同。在我看来,没有一个答案能真正清楚地回答这个问题。 Oriol 顺便提到了一些关于阴影属性的内容,但仅此而已。无论如何,如果共识相反,我不会反对它。 :-)
  • @T.J.Crowder 我会接受任何模组移除:-)

标签: javascript apply


【解决方案1】:

可以覆盖函数上的方法,使apply 做一些不同于其默认用途的事情:

function foo() {
  console.log("This doesn't happen");
}
foo.apply = function() {
  console.log("This happens instead.");
};

foo.apply({});

此外,在过去,主机提供的函数并不总是有这些方法(但现在大部分情况都不是这样)。

这类似于人们推荐使用Object.prototype.hasOwnProperty.call(x, y) [或新的Object.hasOwn(x, y)] 而不是x.hasOwnProperty(y) 的原因。 (但在这种情况下,它还可以防止x 不从Object.prototype 继承的可能性,这现在是可能的。例如,如果xObject.create(null) 的结果或继承自任何创建的对象那样。)

【讨论】:

  • 没错,但由于applyFunction.prototype 的可配置和可写属性,因此也可以覆盖Function.prototype.apply,使其执行默认用途以外的其他操作。 (同样适用于Reflect.apply。)所以,关于这一点,没有真正的区别。
  • @Min-SooPipefeet - 有一点不同:与Function.prototype.apply 混在一起会破坏很多东西。在特定功能上使用apply 只会破坏那些特定功能上的apply。 (然后是主机提供的功能,现在基本上是历史性的。)
  • 是的,没错。这似乎只是一个问题,在我的环境中的两种篡改中哪一种更有可能发生。但仍然两者都是可能的。刚刚在 node .js REPL 中尝试过,我的系统在这两种情况下都没有爆炸。 ;-)
  • @Min-SooPipefeet - 我的意思是一旦你开始使用一些不是你自己的或标准库的一部分的模块。 :-)
猜你喜欢
  • 1970-01-01
  • 2016-05-23
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 2014-03-12
  • 2012-12-13
  • 2013-11-07
相关资源
最近更新 更多