2016-04-06 6 views
2

middle引数がオプションですが、最後の引数が必須のJavaScript関数を実装する一般的な方法は何ですか?慣用的なES2015ソリューションが好ましい。中間引数を任意にするための慣用的方法

は、例えば、私は一般的に、このような複数の方法で呼び出すことができる機能を、以下を参照してください。

func(firstArg, callback); 
func(firstArg, options, callback); 

だから何実際に起こることは引数の数は、各引数の解釈に影響を与えることがあります。

私は、引数の長さをチェックすることにより、このような何かこれを扱うことができます知っている:

//  func(firstArg, options, callback); 
// or: func(firstArg, callback); 
function (firstArg, ...args) { 
    let options = {}; 
    if (args.length > 1) { 
     options = args.shift(); 
    } 
    let callback = args[0]; 
    // And do stuff ... 
} 

をしかし、それは不格好と思われます。これを行うより良い方法はありますか?

+0

代わりにオブジェクトを渡します。 – Andy

+0

'options'引数がオブジェクトです。 – brianmearns

+1

ほとんどの言語では、最初の場所でこの混乱/不自然さを避けるために、可変引数関数のオプションの引数*規則の後に*オプションの引数だけを指定することができます。 @AlexK。 –

答えて

1

使用..argspop()配列からのコールバック:

function thing(...args) { 
    var cb = args.pop(); 
    //... args is now [1, obj] 
    cb(args[0]); 
} 

thing(1, { a: 1 }, function (data) { 
    console.log(data); // 1 
}); 
+0

OP、 'cb'が関数であることをテストしてください:) – Andy

0

慣用的な方法は、型チェックを伴うだろう。デフォルトのパラメータを利用することもできます。

function test(firstArg, callback, options = {}) { 
    if (typeof options == 'function') { 
    callback = arguments[2]; 
    options = arguments[1]; 
    } 

} 

は、これはあなたが常にoptionsオブジェクト誰かがcallbackoptionsの引数を切り替えた場合も動作します持っていることを保証するだけでなく。オプションが2番目か最後に来るかどうかは関係ありません。さらに重要なのは、ソースコードが明らかにその意図を示していることです。

+0

これはうまくいくと私は同意しますが、ES6やNodeでは慣用的ではないと私は同意します。実際、私はES6では '引数'は廃止されている(または少なくとも落胆している)と信じています。JavaScriptでは型チェックがほとんど行われていません。 いずれにせよ、私は、さまざまな注文のオプションを悪いパターンで渡すことができます。特に、一般的ではないためです。どのような引数があるかを調べるためにチェックを打つことができます(私が概説した特定のケースでうまくいくでしょう)。 – brianmearns

+0

@ sh1ftst0rm人気のあるライブラリを見てみると、型チェックは共通のイディオムであることがわかります。 「議論」は推奨されない。実際には改善さえしています。しかし、普及したオペレータの出現により、それは限られた使用である。悪いパターンについて話したい場合は、オプションの中間引数について話してください。任意の順序で引数を渡すことができれば、悪いパターンを見つけることができたら、まずは複数の引数が良いかどうかを確認してください。あなたの人生の中で決して間違った順序を取ったことがないなら、私は私の心を変えたいと思っています。 – zeroflagL

+0

私たちはおそらくこれをノッチの下に置くことができます。パターンが悪いかどうかにかかわらず、オプションの中間引数はノードでは非常に一般的であり、引数と引数の間に大きな違いがあります。引数の順序を正しく取ることは常に問題ですが、私はあなたがカリングやビルダーパターンのようなものでそれを解決する方が良いと思います。呼び出しコードが特定の引数の順序を入れ替えるようにしますが、他の引数は入れ替えないようにします。いたるところで異なる注文をすることによって混乱を招くのではなく、固定された注文を保ち、それを学ばせるだけの方がいいです。 – brianmearns

関連する問題