maksim-korzhov
12/13/2017 - 7:05 PM

curring

// Функция реализующая каррирование
Function.prototype.partial = function() {
  // Сохраняем контект и аргументы текущей функции
  var fn = this,
      args = Array.prototype.slice.call(arguments);
  
  // Т.к. partial - функция, то мы должны вернуть функцию
  // Кроме того, мы замыкаем fn и args, чтобы сохранить их
  return function() {
    // Проходим по списку аргументов
    var arg = 0;
    for( var i = 0; i < args.length && arg < arguments.length; i++ ) {
      if(args[i] === undefined) {
        // Заменяем аргументы undefined на аргументы из текущей функции
        args[i] = arguments[arg++];
      }
    }
    
    // Вызываем функцию с новым списком аргументов
    return fn.apply(this, args);
  }
};

/* Использование */
// 1. Делаем отложенную функцию
var delay = setTimeout.partial(undefined, 1000);
delay(function() {
  console.log("Delayed function");
});

// 2. Делаем вызов callback, но сам callback передаём позже
var bindClick = document.getElementById("button").addEventListener.partial("click", undefined, false);
bindClick(function() {
  console.log("Button was clicked!");
});