Javascript - 将参数传递给函数

时间:2011-02-04 01:23:05

标签: 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);

};

我的问题是,有更好的方法吗?调用这些“选项”是常见的做法(或没关系)吗?您是否通常需要“解包”(缺少更好的术语)选项并在函数内设置本地变量?我一直在这样做,以防其中一个没有定义。

我真的希望不要创造坏习惯并编写一堆丑陋的代码。任何帮助都是由我赞赏和+。感谢。

6 个答案:

答案 0 :(得分:14)

我做的完全相同,除了我没有为函数内的每个选项声明一个新变量。

我认为选项是一个很好的名称,虽然我将它缩短为 opts

我在函数中总是有一个“默认”对象,为每个可用选项指定默认值,即使它只是 null 。我使用jQuery,所以我可以使用$ .extend来合并默认值和用户指定的选项,如下所示:var opts = $.extend({}, defaults, opts);

答案 1 :(得分:10)

我相信这是一个很好的模式。我听说过像这样的选项对象在其他语言中被称为“构建器对象”(至少在对象创建的上下文中)。以下是一些优点:

  • 您的函数的用户不必担心参数的顺序。这对于像您这样的方法需要大量参数的情况特别有用。很容易让这些混淆,JavaScript不会抱怨!
  • 很容易使某些参数可选(在编写插件或实用程序时这很方便)。

但是有一些陷阱。具体来说,你的函数的用户无法指定一些选项,你的代码会窒息(请注意,这也可能发生在普通的JS函数中:用户仍然不必提供正确的参数)。处理此问题的一种好方法是为不需要的参数提供默认值:

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

$(element).val(value);

如果没有提供正确的参数,您也可以立即从函数返回或throw an exception

学习如何处理构建器对象的一个​​很好的资源是查看jQueryUI之类的内容。

答案 2 :(得分:4)

我意识到这个问题已经有一年了,但我认为将一个任意数量的参数传递给JavaScript函数的最简洁方法是使用数组和内置的apply方法:

fun.apply(object, [argsArray])

fun是函数,object是您希望函数执行的范围/上下文,argsArray是参数数组(可以包含任何参数)要传递的参数数量。

目前存在的缺陷是必须是一个数组(文字或对象)而不是类似数组的对象,例如{'arg':6,'arg2':“stuff “}。 ECMAScript 5将允许您传递类似数组的对象,但它目前似乎只适用于FireFox,而不是IE9或Chrome。

答案 3 :(得分:2)

如果你看一下jQuery实现,它会使用一个options类来处理大多数任意数量的参数函数,所以我认为你们的团队很好。

另一种方法是测试arguments.length,但只有在你的参数总是以可选的顺序排列时才有效。

答案 4 :(得分:2)

值得记住的是,所有函数都有一个名为arguments的奖励参数,它是一个非常像JS数组的对象(它有length,但没有数组函数)包含传递的所有参数英寸

如果您想传递一系列参数(例如

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

如果不是这种情况并且您只有很多参数,请按照您的描述使用params对象。

答案 5 :(得分:1)

这种做法没有错。

“选项”似乎与任何名称一样好。

您不需要“解包”它们,但如果您将多次访问同一项,则在局部变量中引用它们会更有效,因为局部变量访问通常比属性查找更快