@KnightForce

Как работают Function.bind.apply и function.apply.bind?

Вдел примеры таких функций Function.bind.apply() <и /b>function.apply.bind();
Зачем и что они делают?
Какой в них смысл, тем более обращаясь к Function?
  • Вопрос задан
  • 476 просмотров
Пригласить эксперта
Ответы на вопрос 1
youngmysteriouslight
@youngmysteriouslight
ТК, ТТ, JS, FP, WM
Предполагаю, что описание и принцип работы bind и apply нам известен.
Для простоты рассуждений удобно считать, что this является как бы нулевым аргументом.
Нам потребуется следующее: g.bind(t, x)условно эквивалентно
function (a) {
  return g.call(t, x, a);
}


Что делает приведённый код

Строго говоря, Function.apply не то же самое, что Function.prototype.apply. Но в рассматриваемом случае, как мы увидим, они взаимозаменяемы, потому что их значения совпадают (указывают на одну функцию с одним кодом).
Function.apply.bind(f, null) возвращает функцию, грубо говоря (потому что неявно предполагается, что эта функция в будущем будет вызвана ровно с одним аргументом), такого вида
function (a) {
  return Function.apply.call(f, null, a);
}
что условно (потому что здесь происходит изменение f как объекта; в действительности, вызывается apply с this=f) эквивалентно
function (a) {
  f.apply = Function.apply;
  return f.apply(null, a);
}
Поскольку функция f при нормальных обстоятельствах наследует тот же apply, что и Function, Function.apply.apply(f, null, a) полностью эквивалентно f.apply(null, a).

Почему важно указать null
Потому что, если его не указать, получится функция
function (a) {
  return f.apply(a);
}
то есть a будет передано как this.

Это тоже может иметь смысл. Сравните:
альтернативный пример
function foo(bar,baz) {
  var x = bar * baz;

  return [
    Promise.resolve(x),
    Promise.resolve(x*2 )
  ];
}

Promise.all(
  foo( 10, 20 )
)
.then( Function.apply.bind(
  function() {
    console.log( this[0], this[1] );
  }
) );
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы