function partial(fn) {
var context = this, //Сохраняем текущий контекст
params = Array.prototype.slice.call(arguments); //Преобразуем аргументы в нормальный массив с помощью такого хака
params.shift(); //Убираем первый аргумент, так как он у нас уже есть в качестве "fn" и дальше не нужен
return function() { //Возвращаем новую ф-цию
var params2 = Array.prototype.slice.call(arguments); //Дополнительные параметры также преобразуем в массив
var newParams = params.concat(params2); //Склеиваемзабинденные параметры + дополнительные (текущие);
return fn.apply(context, newParams); //Вызываем "fn" с сохранённым контекстом и с склеенными параметрами
}
}
function mult(a, b, c, d) { return a * b * c * d; }
var mult23 = partial(mult, 2, 3); // мы зафиксировали первые 2 аргумента mult() как 2 и 3
alert(mult23(4, 5)); // 2*3*4*5 = 120
alert(mult23(1, 1)); // 2*3*1*1 = 6