Предполагаю, что описание и принцип работы 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] );
}
) );