Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript function argument handling

It seems the best way to deal with arguments in javascript functions is to require the caller to pass an associative array:

example = function(options) {
  alert('option1: ' + options.a + ', option2: ' + options.b);
}

Now arguments are named and not needed in any particular order when calling this function:

example({'b':'hello option2', 'a':'hello option1'});

The only thing I don't like is I have to have all this extra code to deal with required and default arguments, not to mention not allowing extra arguments so the caller knows they called the function wrong:

example = function(options) {
var required_args = ['a', 'd'];
var default_args = {'b':'option2', 'c':'option3'};
var allowed_args = ['a', 'b', 'c', 'd'];
// check required args
// check allowed args
for (var arg in default_args) {
    if (typeof options[arg] == "undefined")
              options[arg] = default_args[arg];
  }
  alert('option1: ' + options.a + ', option2: ' + options.b);
}

Is there a standard way to deal with this? I guess I can create a function like:

deal_with_args(options, required_args, default_args, allowed_args)

And throw some exception if required_args or allowed_args is violated...

like image 481
at. Avatar asked May 31 '26 23:05

at.


2 Answers

  1. Why do you want to have arguments in an arbitrary order? This is just confusing for people reading your code
  2. A function shouldn't have a lot of arguments - it's a hint that it is doing too much
  3. The usual pattern for 'required' and 'default' params doesn't seem so bad to me.

The 'standard' form is something like:

function myFunc(required_param, some_param, param_with_default) {
  // obviously this needs modifiction (ie use 'typeof' as you did) 
  // if you're dealing potentially 'falsey' values
  param_with_default = param_with_default || 'some default value';
  // same caution applies here
  if(!required_param) {
    // throw some exception here, or return an error code, or whatever
  }

  // function code
}
like image 133
sje397 Avatar answered Jun 03 '26 12:06

sje397


Could you do null coalescing for the required args?

alert('option1: ' + (options.a || default_args[a]) + ', option2: ' + (options.b || default_args[b]));

(Edited to correct the operator error)

like image 42
Josh Anderson Avatar answered Jun 03 '26 12:06

Josh Anderson