2

ID、オプションのプロパティ パラメータ、およびコールバック関数を受け取る関数「get」が必要です。次のように使用されます。

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

以下に可能な実装を1つ含めました

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 に答える