8

ユーザーを簡単にするために、必要な引数の前にオプションの引数を最初に受け取る関数があります。例えば:

ns.myFunction('optional arg', function(){
    //the required callback
});

コールバック本体が長くなる可能性があり、ユーザーがオプションの引数のデフォルトをオーバーライドするのを忘れる可能性があるため、次のことを行うのではなく、これを行っています。

ns.myFunction(function(){
    //the required callback
}, 'optional arg');

現在、私はこれを確認するためにこれを行っています:

function myFunction(first, second) {

    //if second is undefined and first is a function
    if (typeof second === 'undefined' && typeof first === 'function') { 
        second = first;
    }
}

質問

  • これは正しい方法ですか?
  • 特に必要な引数の前にN個のオプションの引数がある場合、スケーリングするようにするにはどうすればよいですか?
4

8 に答える 8

4

オプションのパラメーターは慣例により常に最後に配置されるため、これは正しい方法ではありません。そして、その理由がわかります。それらを処理する方がはるかに簡単です。匿名関数の長さが問題になる場合、API のクライアントは関数参照または変数を使用する必要があります。

function callback1() { //...

var callback2 = function() {//...

myFunction(callbackX, optional);

エスケープの問題thisは で解決できますbind()

複数のオプション パラメータのパスに移動し、最後にコールバックしたい場合は、2 つの方法を考えることができます。argumentsオブジェクトまたはすべてのオプション引数を 1 つのoptionsオブジェクトにラップすることです。

argumentsあなたが書くことができます:

var lastOptionalIndex = arguments.length - 2;
var callback = arguments[lastOptionalIndex + 1];  //required callback is always last
var optionalFirst = lastOptionalIndex >=0? arguments[0] : undefined;
var optionalSecond = lastOptionalIndex >=1? arguments[1] : undefined;
//...

それがどれほど醜いか比較してください:

function myFunction(callback, firstOptional, secondOptional //...

optionsラッパー オブジェクトでは、常に 2 つの引数があります。

function myFunction(options, callback);

はただoptionsのオブジェクトです:

{
  firstOptional: 1,
  secondOptional: 'foo'
  //...
}
于 2012-06-23T12:27:39.350 に答える
2

ArgueJS で簡単に実行できます

function myFunction (){
  arguments = __({first: [String], second: Function})

  // and now on, you can access your arguments by
  //   arguments.first and arguments.second
}

非常によく似た例がArgueJS の最初の例にあります。真ん中のパラメーターのみが必要であることに注意してください。

function range(){ 
  arguments = __({start: [Number, 0], stop: Number, step: [Number, 1]})

  for(var i = arguments.start; i < arguments.stop; i += arguments.step)
    console.log(i);
}

交換:

>>> range(3)
 0
 1
 2
>>> range(3, 5)
 3
 4
>>> range(0, 5, 2)
 0
 2
 4
于 2013-04-12T16:32:12.817 に答える
1

パラメータに名前を付ける必要はありません。あなたは簡単に言うことができます:

if (arguments.length < 2)  // There are no optional parameters

そして、arguments[i] を介して各パラメーターを取得します。この関数は、arguments[arguments.length - 1] にあります。

マイナーな注意として、typeof 演算子は常に文字列を返すため、=== の代わりに == を使用できます。

于 2012-06-23T12:25:59.287 に答える
1

ArgueJS:

function range(){ 
  arguments = __({start: [Number, 0], stop: Number, step: [Number, 1]});
  for(var i = arguments.start; i < arguments.stop; i += arguments.step)
    console.log(i);
}

ES6 でさらに美しく:

function range(){ 
  {start, stop, step} = __({start: [Number, 0], stop: Number, step: [Number, 1]})
  for(var i = start; i < stop; i += step)
    console.log(i);
}

またはCoffeeScript:

range = ->
  {start, stop, step} = __ {start: [Number, 0], stop: Number, step: [Number, 1]}
  console.log i for i in [start...stop] by step
于 2014-10-25T17:53:41.997 に答える
0

最初に複数のオプションのパラメーターを本当に渡したい場合は、次のようにすることができます。

function myFunction() {
    alert("optional:");
    for(var i=0; i<arguments.length-1) alert(arguments[i]);
    alert("function: "+ arguments[arguments.length-1]);
}

しかし、それはかなり醜いです。オプションのものは最後に置くべきだと思います。

于 2012-06-23T12:28:00.153 に答える