Обработка аргументов функции JavaScript - PullRequest
3 голосов
/ 23 сентября 2010

Кажется, лучший способ справиться с аргументами в функциях javascript - это потребовать, чтобы вызывающая сторона передала ассоциативный массив:

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

Теперь при вызове этой функции аргументы именуются и не нужны в каком-либо определенном порядке.:

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

Единственное, что мне не нравится, это то, что мне нужно иметь весь этот дополнительный код, чтобы иметь дело с обязательными и стандартными аргументами, не говоря уже о том, чтобы не допускать дополнительных аргументов, чтобы вызывающий знал, что они вызвали функциюнеправильно:

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);
}

Есть ли стандартный способ справиться с этим?Я полагаю, я могу создать такую ​​функцию, как:

deal_with_args(options, required_args, default_args, allowed_args)

и выдать какое-то исключение, если required_args или allow_args нарушены ...

Ответы [ 3 ]

3 голосов
/ 23 сентября 2010
  1. Почему вы хотите иметь аргументы в произвольном порядке?Это просто сбивает с толку людей, читающих ваш код
  2. Функция не должна иметь много аргументов - это намек на то, что она делает слишком много
  3. Обычный шаблон для 'required' и 'параметры по умолчанию не кажутся мне такими плохими.

Стандартная форма выглядит примерно так:

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
}
1 голос
/ 23 сентября 2010

Не могли бы вы сделать нулевое слияние для требуемых аргументов?

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

(отредактировано для исправления ошибки оператора)

0 голосов
/ 23 сентября 2010

Я думаю, что может быть допустимо передавать хэши параметров функциям в javascript, особенно для конструкторов для компонентов пользовательского интерфейса и т. Д. В этих случаях вы можете иногда получить десятки параметров, для которых нужно настроить, поэтому я не думаю, что это всегда плохая идея передавать аргументы как хэш.

В этих случаях я думаю, что было бы разумно иметь готовый хэш разумных значений по умолчанию, а затем расширять его передаваемым объектом.

Я полагаю, что большинство людей сделали бы это с помощью метода extends в рамках своего выбора (Object.extend (obj1, obj2) в прототипе, jQuery.extend (obj1, obj2, ... objn) и т. Д.методы просто делают для in и копируют свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...