Вы можете передать все необязательные аргументы в объекте в качестве первого аргумента. Второй аргумент - ваш обратный вызов.Теперь вы можете принять столько аргументов, сколько вы хотите в вашем первом объекте аргумента, и сделать его необязательным, как так:
function my_func(op, cb) {
var options = (typeof arguments[0] !== "function")? arguments[0] : {},
callback = (typeof arguments[0] !== "function")? arguments[1] : arguments[0];
console.log(options);
console.log(callback);
}
Если вы называете это, не проходя аргумент опции, то по умолчанию будет пустой объект:
my_func(function() {});
=> options: {}
=> callback: function() {}
Если вы вызываете его с аргументом опции вы получите весь ваш Params:
my_func({param1: 'param1', param2: 'param2'}, function() {});
=> options: {param1: "param1", param2: "param2"}
=> callback: function() {}
Это может, очевидно, быть переделано для работы с большим количеством аргументов, чем два, но получить еще более кооперативы nfusing. Если вы можете просто использовать объект в качестве своего первого аргумента, вы можете передать неограниченное количество аргументов с помощью этого объекта. Если вам абсолютно необходимы дополнительные аргументы (например, my_func (arg1, arg2, arg3, ..., arg10, fn)), я бы предложил использовать библиотеку, такую как ArgueJS. Я лично его не использовал, но выглядит многообещающе.
undefined - глобальное свойство с постоянным значением, поэтому вам не нужно его цитировать. В устаревших браузерах вы можете случайно установить его на произвольное значение, но это не относится к современным браузерам. – andreszs
@Andrew: 'typeof' всегда возвращает строку. Кроме того, 'if (options === undefined)' также будет работать. Но, как вы сказали, в старых браузерах можно переопределить 'undefined', поэтому все еще преобладающая практика (я думаю) заключается не в том, чтобы напрямую использовать' undefined' (если вы не указали где-то явно). –
не сравнивать строки с '===', это не тот же объект, если у вас одинаковый контент. – inetphantom