2

特に Javascript では、API が特定の引数の文字列または関数のいずれかを受け入れる関数を公開するのが一般的です。文字列は「すでに初期化された」値を提供しますが、関数は実行時に値を生成します。

// Call foo with known value
api.foo('bar')
// or defer value determination to run-time
api.foo(function() { return 'bar'; }

これは、これらの API 呼び出しに渡す引数が実行時までわからない場合があるため、より柔軟です。

api.foo(function() { return prompt('foo or bar ?'); });

このメソッドは、一般向けの関数に対していくらか予約されます (より複雑な署名を導入し、落とし穴がある可能性があるため、その数を低く抑えるのが最善です)。

の線に沿った何か

api = {
  // "public" function
  func: function(a) {
    if (typeof(a) == 'function')
      return this._func(a());
    else
      return this._func(a);
  },
  // Actual implementation
  _func: function(a) {
    [...]
  }
}

動作するはずですが、より効率的でエレガントな代替手段が確かにあります。何か案は ?

更新: @camus によるコメント (および現在は消えているが関連性のある回答) に続いて、私の意図を明確にし、これが API にどのように関連するかを説明する更新があります。

関数を書くとき、それがどの方法で呼び出されるかわからないことを考慮してください。また、関数に制限的な仮定を置きたくありません。この関数は用途が広いように設計されているため、異なるシグネチャを使用して複数回呼び出すことができます。呼び出し元に文字列の使用を強制することもできますが、文字列を返す関数に任せると便利です。この関数には、追加のパラメーター (インデックスなど) を渡すことができます。これはもちろん API のコンテキストに非常に固有のものですが、一般的な考え方は、「返す文字列と関数を処理する方法」です。 -洗練された方法で引数をストリングしますか?".

4

3 に答える 3

3

これを実装する簡単な方法は次のとおりです。

api = {
  // "public" function
  func: function(a) {
    if (typeof a == 'function') {
      a = a();
    }
    // rest of function
  }
}
于 2013-01-08T09:56:13.343 に答える
2

私は一緒に行きます:

api = {
  func: function(a) {
    if(typeof a == 'function') a = a.call(this); // Transmit api as scope for a, may be useful for accessing api tools ...

    // Process a ...
  }
};
于 2013-01-08T09:56:26.667 に答える
0
api = {
  func: function( a ) {
    typeof a == 'function' && a.call( this, arguments ); 
  }
};
于 2013-01-08T09:59:22.347 に答える