【问题标题】:Javascript parameters: Having many parameters with many defaultsJavascript 参数:具有许多具有许多默认值的参数
【发布时间】:2011-02-13 03:19:02
【问题描述】:

我有一个带有许多参数和许多默认值的函数。

function foo(p1 ,p2, p3, p4, p5, p6){
    var p1 = p1 || 'default1'; 
    var p2 = p2 || 'default2'; 
    var p3 = p3 || 'default3'; 
    var p4 = p4 || 'default4'; 
    var p5 = p5 || 'default5'; 
    var p6 = p6 || 'default6'; 
}

我怎样才能成功地只定义像 p1 和 p6 而不是其余的?

我知道在 Scala 中你可以做到 foo(p1='something1',p6='something6')

【问题讨论】:

    标签: javascript function parameters


    【解决方案1】:

    您应该获取一个带有参数属性的对象。

    例如:

    function foo(options) {
        var p1 = options.p1 || 'default1'; 
        ...
    }
    
    foo({ p1: 3, p6: "abc" });
    

    【讨论】:

    • 您还可以循环遍历选项对象和另一个对象以最小化代码大小。
    • 这也回答了我的问题“如何防止编写带有许多参数的函数?”
    【解决方案2】:

    您可以使用一个作为对象的参数并为默认值做 jQuery 扩展,例如:

    function foo(args) {
       jQuery.extend({
          p1: 'default1',
          p2: 'default2',
          p3: 'default3',
          p4: 'default4',
          p5: 'default5',
          p6: 'default6'
       }, args);
    }
    
    foo({p1: 'one', p6: 'six'});
    

    在要扩展的第二个参数中定义的任何属性都将覆盖第一个参数中的属性。

    【讨论】:

    • 是的,没必要。您可以像在问题中那样定义默认值。不过,我们的答案将是相同的,这并不有趣;)
    • 拥有该功能是必不可少的,无论是否使用 jQuery:function extend(dest, src) { for (prop in src) dest[prop] = src[prop]; return dest }(天真的实现)。这是继承时构造函数的最佳选择,因为您不必在调用父构造函数时收集所有值以传递给父构造函数 - 只需使用 extend 应用您自己所需的默认值并执行 ParentConstructor.call(this, args)
    【解决方案3】:

    这些被称为“命名参数”,并且有几个关于它们的教程(使用@SLaks 回答中的对象):

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      相关资源
      最近更新 更多