Это уже интереснее, но я все же склоняюсь к тому чтобы не разбирать по именам аргументы
function merge(arr1, arr2){
var length = Math.max(arr1.length, arr2.length),
arr = [];
for(var i = 0; i < length; ++i){
arr.push(i < arr1.length ? arr1[i] : arr2[i]);
}
return arr;
}
function withDefaults(fn, defaults, cnx){
if(!defaults){
defaults = [];
}
if(!cnx) {
cnx = this;
}
return function(/* args for fn*/){
return fn.apply(cnx, merge(arguments, defaults));
}
}
function mul(a, b){
alert(a + "*" + b + " = " + a*b);
}
withDefaults(mul, [3,5])(5,7);
withDefaults(mul, [3,5])();
withDefaults(mul, [3,5])(6);