Если пока не использовать ES6, то можно сделать ручками нечто вроде:
jsfiddle.net/DigitalBrain/1detwmvr/**
* Attach defaults to function
* @param {Function} fn function for which the defaults are set
* @param {Array} defaults function defaults array
* @param {Number} [count] count of required parameters
* @param {Object} [context] scope for fn
* @returns {Function}
*/
function defaults(fn, defaults, count, context) {
if (!Array.isArray(defaults))throw TypeError("function defaults must be an array!");
if(!count)count=0;
return function () {
var args = Array.prototype.slice.call(arguments),
len = args.length,
defLength = defaults.length,
index=len-count,
callArgs = index>=0 && len < defLength+count ? args.concat(defaults.slice(index)) : args;
if (count && len < count) {
throw TypeError("Function expected at least "+count+" argument"+(count > 1 ? "s" : "")+", but "+len+" were given");
}
return fn.apply(context || this, callArgs);
}
}
/**
*
* @param a - var1.
* @param [b=2] - var2.
* @param [c=3] - var3.
* @param [d=4] - var3.
* @type {Function}
*/
var f=defaults(function(a,b,c,d){
console.warn(arguments);
}, [2,3,4], 1);
f(5, 9, 18, 100);// [5, 9, 18, 100]
f(5, 9, 18);// [5, 9, 18, 4]
f(5, 9);// [5, 9, 3, 4]
f(5);// [5, 2, 3, 4]
f();// TypeError: Function expected at least 1 argument, but 0 were given
Можно конечно запихнуть это в прототип функции и синтаксис стает приятнее:
var f=function(a,b,c,d){
console.warn(arguments);
}.defaults([2,3,4], 1);
...но не совсем гуд так делать