Javascript回调和可选参数

时间:2011-02-27 20:05:25

标签: javascript callback optional-parameters

如果我正在创建一个包含两个必需参数的函数,一个是回调函数,另外一个是可选的,我可以如何对其进行编码,这样当我调用它时只有2个必需参数。

例如:

  

功能保存(颜色,大小,重量,回调){...}

颜色和回调是强制性的,尺寸和重量是可选的。因此,如果有人想要仅使用颜色和回调调用此函数...

  

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

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

但是这会将回调函数分配给大小和重量,我该如何解决这个问题呢?

7 个答案:

答案 0 :(得分:12)

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

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 () { /* ... */ });

答案 1 :(得分:8)

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() {});

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

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)
});

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我为此建议ArgueJS

function save() {
  arguments = __({color: undefined, size: [undefined], weight: [undefined], callback: Function})

  // access your args by arguments.paramName. Ex.:
  // alert(arguments.color)
...
}

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