При изучении API незнакомой библиотеки или модуля может быть удобно распечатать аргументы функций обратного вызова, переданные в методы библиотеки, часто включая аргументы, которые вы изначально передали этим методам.

someLib.someCoolStuff(a, b, (foo, bar) => {
  console.log('someCoolStuff', a, b, foo, bar);
});
someLib.someCoolStuff(c, (foo, bar) => {
  console.log('someCoolStuff', c, foo, bar);
});
someLib.otherRadThing(d, (herp, derp) => {
  console.log('otherRadThing', d, herp, derp);
});

Используя некоторые функции ES6 и немного кода в гольф, вы можете создать лаконичную фабрику карри, чтобы помочь в такого рода исследованиях.

const curryception = (f) => (...r) => f.bind(f, ...r);

У тебя не инсульт! Это функция, которая принимает функцию, а затем возвращает другую функцию, которая также возвращает функцию, которая запускает исходную функцию.

Все аргументы, переданные возвращаемым функциям по пути, передаются вашей исходной функции.

const kick = curryception((...r) => console.warn(...r));
kick('Cobb', 'Eames', 'Mal')('Ariadne', 'Saito', 'Fischer');
// ⚠ Cobb Eames Mal Ariadne Saito Fischer

Вы можете использовать потрясающую мощь curryception, чтобы упростить передачу отладочных обратных вызовов. Вот менее надуманный пример, демонстрирующий полезность этих 27 байт вкусного карри:

const log = curryception(console.log.bind(console));
const getRequest = new ioUtil.Request({ ... });
const postRequest = new ioUtil.Request({ ... });
ioUtil.get(getRequest, log('get', getRequest));
ioUtil.post(postRequest, log('post', postRequest));

И возвращаясь к исходному примеру someLib:

someLib.someCoolStuff(a, b, log('someCoolStuff', a, b));
someLib.someCoolStuff(c, log('someCoolStuff', c));
someLib.otherRadThing(d, log('otherRadThing', d));

Это особенно полезно, когда вы не уверены в количестве возвращаемых аргументов, так как будут напечатаны все аргументы, переданные как вашей currycepted-функции, так и вашим обратным вызовам.

При currycepting вы можете привязать контекст this ваших обратных вызовов к функции, которую вы передаете curryception(), или использовать функцию стрелки для наследования окружающего контекста.

curryception(func.bind(context));
curryception((...rest) => {
  // Do something with ...rest and outer `this`.
});

Мы должны пойти глубже

Добавление дополнительных пар элементов отдыха и распространения может помочь вам еще больше раздуть ваш средний пост о новинках ES6.

const curryception = (f, ...a) => (...b) => f.bind(f, ...a, ...b);
const boundLog = console.log.bind(console);
const ioLog = curryception(boundLog, 'ioUtil');
const renderLog = curryception(boundLog, 'renderUtil');
const request = new ioUtil.Request({ ... });
ioUtil.get(request, ioLog('get', request));
renderUtil.drawCanvas({ ... }, renderLog('drawCanvas'));

ES6 предлагает элегантные и мощные способы рассказать о JavaScript. ;)