【问题标题】:Javascript callbacks and optional paramsJavascript 回调和可选参数
【发布时间】:2011-02-27 20:05:25
【问题描述】:

如果我正在创建一个接收两个强制参数的函数,一个是回调,一个是可选的,我如何对其进行编码,以便当我只使用 2 个强制参数调用它时它可以工作。

例如:

函数保存(颜色、大小、重量、回调){ ... }

颜色和回调是强制性的,尺寸和重量是可选的。所以如果有人想只用颜色和回调来调用这个函数......

保存('blue', function(...) { ... }) { ... }

 save('blue', 56, function(...) { ... }) { ... }

但这会将回调函数分配给大小和重量,我该如何解决这个问题以做我想做的事?

【问题讨论】:

  • 您可以使用typeof查看传递的参数类型。取决于是否例如第三个是字符串或函数,您可以编写脚本如何解释参数列表。

标签: javascript callback optional-parameters


【解决方案1】:

参数对象可以很好地解决您的问题,如下所示:

function save(params, callback) {
    params.color = params.color || 'default';
    params.size = params.size || 0;
    params.weight = params.weight || 0;

    // ...

    if (callback instanceof Function) { callback(); }
}

这样使用:

save({ color: 'blue', weight: 100 }, function () { /* ... */ });

【讨论】:

  • javascript如何知道颜色是第二个参数?当我使用这个 sn-p 时,我得到的只是所有未定义的变量。
【解决方案2】:

JavaScript 参数必须在位置上与预期参数对齐,因此在传递的其他参数之间省略一个参数是行不通的。一种选择是在单个对象中传递可选参数。

// callback is required
// additional arguments are passed as props of 'options'
function save(options, callback) { 
    var color = options.color || 'blue';
    var size = options.size || 72;
}

像这样传递它们:

save({ color: 'red' }, function() {});

【讨论】:

  • 当options.size为0时,var size = options.size || 72;即使 0 是可变大小的有效值,也会将 72 分配给可变大小。更多关于使用 || 的讨论此处为默认值分配codereadability.com/…
【解决方案3】:

您可以检查arguments.length 来查看传递了多少个参数,并检查typeof weight === 'function' 是否可以查看参数是否为回调。

使用此信息,您可以找出传入的内容并根据需要重新分配参数。

【讨论】:

  • 绝对是最好的答案,需要更多的投票。 :-) 要扩展这个想法,请省略参数声明或将它们放在注释中。在顶部重新声明为 var 并迭代“参数”以确定存在哪些附加参数以及它们是什么,并根据需要进行分配。
  • 这不是很干净
【解决方案4】:

您可以检查参数的类型:http://jsfiddle.net/wknVA/

【讨论】:

    【解决方案5】:

    首先将回调默认设置为自身或下一个最接近的参数,直到可选参数的结尾(第一个),

    接下来检查可选参数是设置为函数(回调)还是未定义,并将它们设置为默认值或将它们设置为它们自己。

    function optional_params(color, size, weight, callback){
        // set callback to itself or the next optional paramater until you have checked all optional paramaters
      callback = callback || weight || size;
        // check if weight is a function(the callback) or undefined and if so set to a default value, otherwise set weight as weight
      weight = typeof weight != 'function' && typeof weight != 'undefined' ? weight : "1.2kg";
        // do the same as above with weight
      size = typeof size != 'function' && typeof size != 'undefined' ? size : "L";
        // invoke callback
      callback(color,size,weight);
    }
    

    及用法:

    optional_params("Red",function(color,size,weight){
      console.log("color: " + color); // color: Red
      console.log("size: " + size); // size: L //(default)
      console.log("weight: " + weight); // weight: 1.2kg //(default)
    });
    

    【讨论】:

      【解决方案6】:

      除了 SLaks 回答之外,调用者并不总是可以假设他们可以发送他们想要的任何 args,记录哪些 args 是可选的函数是最好的方法,对于函数调用实现者来说,检查 arg 的类型和到 arg 列表末尾的可选 args 分组是其他。制作两个相同类型的可选选项会造成混淆。

      【讨论】:

        【解决方案7】:

        为此我推荐ArgueJS

        function save() {
          arguments = __({color: undefined, size: [undefined], weight: [undefined], callback: Function})
        
          // access your args by arguments.paramName. Ex.:
          // alert(arguments.color)
        ...
        }
        

        您还可以通过将undefined 更改为所需的类型来检查参数的类型。

        【讨论】:

          猜你喜欢
          • 2010-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-11
          • 2018-04-24
          • 2012-07-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多