2

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

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

4 回答 4

4

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

function get(id, callback, property)
{
    if(typeof property === "undefined")
        callback(item);
    else
        callback(item[property]);
}
于 2012-05-15T08:40:38.227 回答
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;
    }

    ...
}

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

于 2012-05-15T08:52:28.747 回答
2

您可以更改参数的顺序,或测试给定的函数以找出它们是什么。例如

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

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

于 2012-05-15T08:53:21.603 回答
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();
}
于 2012-05-15T08:52:57.030 回答