I usually use this pattern:

- required args are standard args
- optional args are to be passed in an options object
- if more than 4 or 5 args are required, consider a `argument objects`, then an `options` object (see what backbone does)

works pretty well regarding expressiveness and maintainability.