Почему я должен вызывать Function.prototype.apply.call (x, ...) вместо x.apply (...)? - PullRequest
1 голос
/ 25 марта 2019

Страница документа из Reflect.apply() в веб-документе MDN гласит:

В 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]);


П.С .: Мой вопрос не о Reflect.apply(myFunction, myObject, args);

1 Ответ

4 голосов
/ 25 марта 2019

Возможно переопределить методы в функции, заставив 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 является результатом Object.create(null) или наследуется от любого созданного объектатаким образом.)

...