Ниже приведена обычная функция с именованными параметрами:
function who(name, age, isMale, weight)
{
alert(name + ' (' + (isMale ? 'male' : 'female') + '), ' + age + ' years old, ' + weight + ' kg.');
}
who('Jack', 30, true, 90); //this is OK.
То, чего я хочу достичь, это;передаете ли вы аргументы по порядку или нет;функция должна выдать аналогичный результат (если не тот же):
who('Jack', 30, true, 90); //should produce the same result with the regular function
who(30, 90, true, 'Jack'); //should produce the same result
who(true, 30, 'Jack', 90); //should produce the same result
Это позволяет вам передавать список аргументов в любом порядке , но все равно будет отображаться в логический порядок,Мой подход до сих пор выглядит примерно так:
function who()
{
var name = getStringInArgs(arguments, 0); //gets first string in arguments
var isMale = getBooleanInArgs(arguments, 0); //gets first boolean in arguments
var age = getNumberInArgs(arguments, 0); //gets first number in arguments
var weight = getNumberInArgs(arguments, 1); //gets second number in arguments
alert(name + ' (' + (isMale ? 'male' : 'female') + '), ' + age + ' years old, ' + weight + ' kg.');
}
Здесь есть небольшая проблема;такие функции, как getStringInArgs()
и getNumberInArgs()
, каждый раз проходят через все аргументы, чтобы найти аргумент по типу в указанной позиции.Я мог бы перебирать аргументы только один раз и сохранять флаги для позиций, но тогда мне пришлось бы делать это внутри функции who ().
Считаете ли вы этот подход логичным и единственным?Есть ли лучший способ сделать это?
РЕДАКТИРОВАТЬ 1: Код выше на самом деле работает.Я просто хочу знать, есть ли лучший способ.
РЕДАКТИРОВАТЬ 2 : Вы можете задаться вопросом, является ли это необходимым или имеет ли это смысл.Основная причина: я пишу функцию jQuery, которая добавляет определенный стиль к элементу DOM.Я хочу, чтобы эта функция обрабатывала свои аргументы как сокращенные значения CSS.
Пример:
border: 1px solid red;
border: solid 1px red; /*will produce the same*/
Итак;вот настоящий и окончательный код до настоящего времени:
(function($){
function getArgument(args, type, occurrence, defaultValue)
{
if (args.length == 0) return defaultValue;
var count = 0;
for(var i = 0; i < args.length; i++)
{
if (typeof args[i] === type)
{
if (count == occurrence) { return args[i]; }
else { count++; }
}
}
return defaultValue;
}
$.fn.shadow = function()
{
var blur = getArgument(arguments, 'number', 0, 3);
var hLength = getArgument(arguments, 'number', 1, 0);
var vLength = getArgument(arguments, 'number', 2, 0);
var color = getArgument(arguments, 'string', 0, '#000');
var inset = getArgument(arguments, 'boolean', 0, false);
var strInset = inset ? 'inset ' : '';
var sValue = strInset + hLength + 'px ' + vLength + 'px ' + blur + 'px ' + color;
var style = {
'-moz-box-shadow': sValue,
'-webkit-box-shadow': sValue,
'box-shadow': sValue
};
return this.each(function()
{
$(this).css(style);
});
}
})(jQuery);
Использование :
$('.dropShadow').shadow(true, 3, 3, 5, '#FF0000');
$('.dropShadow').shadow(3, 3, 5, '#FF0000', true);
$('.dropShadow').shadow();