如何处理JavaScript中的可选参数?

时间:2012-05-15 08:34:19

标签: javascript

我想要一个带有id,可选属性参数和回调函数的函数'get'。它会像这样使用:

get(14297, 'name', function processName(name) {...});
get(14297, function processStudent(student) {...});

我在

中包含了一个可能的实现
function get(id, property, callback) {
    var item = ...;
    // property is callback
    if (!callback) property(item);
    // callback is callback
    else callback(item[property])
}

感觉有点奇怪,因为

property(item);

实际上是一个取决于上下文的回调函数。有更好的方法吗?

4 个答案:

答案 0 :(得分:4)

您应该切换参数。试试这个

function get(id, callback, property)
{
    if(typeof property === "undefined")
        callback(item);
    else
        callback(item[property]);
}

答案 1 :(得分:2)

这是jQuery使用的模式:

function get(id, property, callback) {

    // if the 2nd parameter is a function, assume that
    // only two parameters were supplied
    if (typeof property === 'function') {
         callback = property;
         property = undefined;
    }

    ...
}

实际上,如果它看到意外的参数类型,它只是将它们的内容混洗,直到它们与替代定义匹配。

答案 2 :(得分:2)

您可以更改参数的顺序,或测试给出的功能以确定它们的含义。 e.g。

function get(id, property, callback) {
  if (arguments.length == 2) {
    // second argument is callback
    callback = property;
    property = void 0;
  }
  ...
}

function get(id, property, callback) {
  if (typeof property == 'function') {
    // second argument is callback
    callback = property;
    property = void 0;
  }
  ...
}

等等,但这种类型的重载并不是特别受欢迎。

答案 3 :(得分:0)

arguments对象是不可变的。但是你可以在数组中对它进行切片,弹出最后一个参数并像往常一样处理其他参数,因为你知道callback参数不再存在了。

这是一种方法:

function get() {
    // Copy the `arguments` object in an array, since it's immutable
    var args = Array.prototype.slice.call( arguments, 1 ),

    // Pop the last argument of the arguments
        callback = args.pop();

    // Then deal with other arguments
    // For example, check for the existence of the second argument
    if ( args[1] ) {
    }

    // Then, you can call the callback function
    callback();
}