function sum() { return [].reduce.call(arguments, function(a, b) { return a + b; }); } function mul() { return [].reduce.call(arguments, function(a, b) { return a * b; }); } function applyAll(func) { return func.apply(this, [].slice.call(arguments, 1)); } alert( applyAll(sum, 1, 2, 3) ); // 6 alert( applyAll(mul, 2, 3, 4) ); // 24 alert( applyAll(Math.max, 2, -2, 3) ); // 3 alert( applyAll(Math.min, 2, -2, 3) ); // -2 help to understand the code ... namely these lines
return func.apply(this, [].slice.call(arguments, 1)); return [].reduce.call(arguments, function(a, b) { return a * b; });