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);
};
Мой вопрос в том, есть ли лучший способ сделать это? Это обычная практика (или все в порядке) для вызова этих "опций"? И вам обычно нужно "распаковать" (из-за отсутствия лучшего термина) варианты и установить локальные вары внутри функции? Я делаю это так, если один из них не определен.
Я действительно стараюсь не создавать вредные привычки и писать кучу кода, который уродлив. Любая помощь приветствуется и + мной. Спасибо.
Ответы
Ответ 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
Ничего плохого в этой практике.
"Параметры" выглядят как хорошее имя как любое.
Вам не нужно "распаковывать" их, но если вы будете получать доступ к одному и тому же элементу несколько раз, будет немного более эффективно ссылаться на них в локальных переменных, поскольку доступ к локальной переменной обычно быстрее, чем поиск свойств.