1

これは簡単な JavaScript の質問です

私は2つのパラメータを取る関数を持っています:

function myFunction(par1, par2) {

    //Part One
    //This will get executed always

    //Lots of logic here

    if (!par2) {


        //Part Two
        //this will not get executed if FALSE is passed as a second argument
        //more logic here

    }

}

その関数にはifがあり、その実行はpar2(ブール値)に依存します

その関数は他の場所からコード内で何度も呼び出され、呼び出されると両方の部分が実行されます。それは意図されています。ここで、同じ関数を使用する必要がありますが、実行する必要があるのはパート 1 だけです。そこで、2 番目のパラメーターを Bool 型として追加することにしました。そして、それは機能します。

たとえば、myFunction (par1) のような関数を呼び出すと、両方の部分が実行されます。しかし、II のようmyFunction (par1, true)に呼び出すと、パート 1 のみが実行されます。

それはうまくいきます。

Javascript がパラメーターのチェックを行っていないことはわかっていますが、特定の場合に 2 番目のパラメーターとして undefined になってしまいます。

私の質問は、これは通常の慣行ですか?

4

3 に答える 3

2

次のようなデフォルトの引数を指定できます。

function myFunction (par1, par2) {
    par2 = typeof par2 !== 'undefined' ? par2 : false;

    ...
}

2 番目の引数を指定せずに関数を呼び出すと、false代わりにが安全にデフォルトになりますundefined

多くの引数が必要で、すべてが必要ではないことがわかった場合は、代わりにオブジェクトを引数として使用できます。これにより、順序を気にせずに引数を省略できるため、柔軟性が高まります。

function myFunction (params) {
    var defaults = {
        par1 : 'a',
        par2 : false
    }

    if(typeof params == 'undefined') params = {};
    for(var prop in defaults){
        params[prop] = typeof params[prop] == 'undefined' ? defaults[prop] : params[prop];
    }

    // you can now assume that all of the properties are set in params
    // they will either be the value passed, or the default
}

呼び出しは次のようになります。

myFunction({
    par1 : 'a',
    par2 : 'b'
});

またはその他の組み合わせ:

myFunction({
    par1 : 'a'
});

すべてを省略しても:

myFunction();
于 2013-07-04T10:39:47.690 に答える
0

はい、これは機能するため正常ですが、維持と追跡が困難です..

関数呼び出しのパラメーターは、関数の引数です。引数は値によって関数に渡されます。関数が引数の値を変更した場合、この変更はグローバルにも呼び出し元の関数にも反映されません。

ただし、オブジェクト参照も値であり、それらは特別です。関数が参照されたオブジェクトのプロパティを変更する場合、その変更は関数の外部で表示されます..

ここにあなたのための豊富な情報があります: REF

于 2013-07-04T10:39:44.223 に答える
0

Javascript がパラメーターのチェックを行っていないことはわかっており、特定の状況で 2 番目のパラメーターとして undefined になってしまうことがあります。

undefinedこれは偽の値であるため、 を渡したかfalseのように動作します。それを使用することは何も悪いことではありません。

これは通常の慣行ですか?

はい、間違いなく、Javascript での関数のオーバーロード - ベスト プラクティスも参照してください。ただし、明示的に渡す代わりに、false通常は引数を省略します。

于 2013-07-04T11:29:11.960 に答える