为什么我应该调用Function.prototype.apply.call(x,...)而不是x.apply(...)?

时间:2019-03-25 15:34:39

标签: javascript apply

MDN Web文档上的Reflect.apply()中的

The doc page说:

  

在ES5中,通常使用Function.prototype.apply()方法来   调用具有给定值的函数,并以   数组(或类似数组的对象)。   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);

1 个答案:

答案 0 :(得分:4)

可以覆盖函数上的方法,使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)而不是x.hasOwnProperty(y)的原因。 (但是在这种情况下,它还可以防止x不继承自Object.prototype的可能性,现在这种情况是可能的。例如,如果x是{{1 }}或从以此方式创建的任何对象继承。)