compose выполняет функции справа налево. Самая правая получает все аргументы вызова, остальные — по одному результату предыдущего шага.
Создание функции композиции
compose выполняет функции справа налево. Самая правая получает все аргументы вызова, остальные — по одному результату предыдущего шага.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Напишите функцию compose, принимающую произвольное количество функций и возвращающую их композицию. Функция должна корректно работать как с единственной функцией‑аргументом, так и с несколькими, передавая все полученные параметры в первую функцию цепочки.
const square = (x) => x * x;
const times2 = (x) => x * 2;
const sum = (a, b) => a + b;
console.log(compose(square, times2)(2) === square(times2(2)));
console.log(compose(square, times2, sum)(3, 4) === square(times2(sum(3, 4))));
Ответ
compose выполняет функции справа налево. Самая правая получает все аргументы вызова, остальные — по одному результату предыдущего шага.
function compose(...functions) {
return function (...args) {
if (!functions.length) return args[0];
let value = functions[functions.length - 1].apply(this, args);
for (let i = functions.length - 2; i >= 0; i--) {
value = functions[i].call(this, value);
}
return value;
};
}
Оба сравнения из условия дадут true. При единственной функции сохраняются все аргументы; для пустого набора выбран identity по первому аргументу. Это синхронная композиция: Promise автоматически не ожидается, а исключение останавливает цепочку.