Подтвердить что ты не робот

Javascript - Передача аргументов функции

Я всегда передавал аргументы такой функции:

setValue('foo','#bar')

function setValue(val,ele){
    $(ele).val(val);
};

Простите глупый пример. Но недавно я работал над проектом, который имеет некоторые функции, которые принимают множество аргументов. Поэтому я начал передавать аргументы в виде объекта (не уверен, что это правильный способ сделать это):

setValue({
  val:'foo',
  ele:'#bar'
});

И затем в функции:

function setValue(options){

    var value = options.val;
    var element = options.ele;  

    $(element).val(value);

};

Мой вопрос в том, есть ли лучший способ сделать это? Это обычная практика (или все в порядке) для вызова этих "опций"? И вам обычно нужно "распаковать" (из-за отсутствия лучшего термина) варианты и установить локальные вары внутри функции? Я делаю это так, если один из них не определен.

Я действительно стараюсь не создавать вредные привычки и писать кучу кода, который уродлив. Любая помощь приветствуется и + мной. Спасибо.

4b9b3361

Ответ 1

Я делаю то же самое, кроме того, что я не объявляю новую переменную для каждой опции внутри функции.

Я думаю, что варианты - это хорошее имя, хотя я сокращаю его, чтобы выбрать.

У меня всегда есть объект "по умолчанию" внутри функции, который задает значения по умолчанию для каждой доступной опции, даже если ее просто нулевая. Я использую jQuery, поэтому я могу просто использовать $.extend для объединения значений по умолчанию и указанных пользователем параметров следующим образом: var opts = $.extend({}, defaults, opts);

Ответ 2

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

  • Пользователям вашей функции не нужно беспокоиться о том, в каком порядке находятся параметры. Это особенно полезно в таких случаях, как ваш, где метод принимает множество аргументов. Легко получить эти смешения, и JavaScript не будет жаловаться!
  • Легко сделать некоторые параметры необязательными (это пригодится при написании плагина или утилиты).

Однако есть некоторые подводные камни. В частности, пользователь вашей функции не смог указать некоторые параметры и ваш код задохнулся (обратите внимание, что это также может случиться с нормальной функцией JS: пользователю все равно не нужно указывать правильные аргументы). Хороший способ справиться с этим - предоставить значения по умолчанию для параметров, которые не требуются:

var value = options.val || 0;
var element = options.ele || {};  

$(element).val(value);

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

Хорошим ресурсом для обучения методам обработки объектов-строителей является проверка источника таких вещей, как jQueryUI.

Ответ 3

Я понимаю, что этот вопрос - год, но я думаю, что самый чистый способ передать произвольное количество аргументов функции JavaScript - использовать массив и встроенный метод apply:

fun.apply(object, [argsArray])

Где fun - это функция, object - это ваша область/контекст, в котором вы хотите, чтобы функция выполнялась, а argsArray - массив аргументов (который может содержать любое количество аргументов, которые должны быть переданы.

Текущая ошибка сейчас заключается в том, что аргументы должны быть массивом (литералом или объектом), а не похожим на массив объектом, таким как {'arg': 6, 'arg2': "stuff" }. ECMAScript 5 позволит вам передавать объекты типа массива, но он работает только в FireFox в настоящий момент, а не в IE9 или Chrome.

Ответ 4

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

Другой способ - проверить аргумент .length, но это работает только в том случае, если ваши аргументы всегда находятся в одном порядке опциональности.

Ответ 5

Стоит помнить, что все функции имеют бонусный параметр под названием arguments, который является объектом, очень похожим на массив JS (он имеет length, но ни один из функций массива), который содержит все переданные параметры.

Полезно, если вы хотите передать диапазон параметров (например,

function Sum() {
    var i, sum = 0;
    for (i=0; i < arguments.length; i++){
        sum+=arguments[i];
    }
    return sum;
};

Если это не так, и у вас просто много параметров, используйте объект params, как вы описали.

Ответ 6

Ничего плохого в этой практике.

"Параметры" выглядят как хорошее имя как любое.

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