// Функция реализующая каррирование
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!");
});