0

私はここで働いていた前のプログラマーからJS関数を「継承」しました。彼のコードには同じことをする2つの関数があり、それらは少しだけ異なっていることに気づきました。

最初の関数は引数をとらず、その本体の中で次のように条件をテストします。

function parseAll() {
    for (var i = 0; i < 100; i++) {
        if (obj.flag == 0) {
            // do many other things I omit
        }
    }
}

2番目の関数:

function parseOne(stringOne) {
    for (var i = 0; i < 100; i++) {
        if (obj.flag == 0 && obj.str = stringOne) {
            // do other things I omit (same identical things as in the function parseAll
        }
    }
}

ここで、関数を1つの関数に変換しますnull。最初の関数でカバーされている場合はstringいつを渡し、2番目の関数を呼び出す必要がある場合はを渡します。

したがって、2つの違いは、テストする条件のみになります。

関数に渡された引数に基づいて、テストする条件をプログラムで変更するにはどうすればよいですか?合格したかどうか、合格したかobj.flag==0どうかをテストしたい。これは可能ですか?どのように?nullobj.flag==0 && obj.str=stringOnestring

4

1 に答える 1

1

引数が渡されたかどうかは、いくつかの方法で簡単に検出できます。stringOne実際""に「1つの」ケースに使用したい場合は、次のようにします。

function parseOne(stringOne) {
    for (var i = 0; i < 100; i++) {
        if (obj.flag == 0 && (!stringOne || obj.str === stringOne)) {
            // do other things I omit (same identical things as in the function parseAll
        }
    }
}

(私はあなたobj.str = stringOneをに変更しましたobj.str === stringOne。たった1つで=、それは割り当てであり、それはタイプミスだったと思います。)

次に、「all」の場合はparseOne、引数なしで呼び出すことができます(渡す必要はありません)。null

上記は、偽であるため、であることstringOneは決して意味がないことを前提としていることに注意してください。したがって、真であり、「すべて」の場合のように扱います。渡すことが意味があり、その1つの文字列のみを処理したい場合は、少し変更する必要があります。""""!stringOne""

function parseOne(stringOne) {
    var one = typeof stringOne !== "undefined";
    for (var i = 0; i < 100; i++) {
        if (obj.flag == 0 && (!one || obj.str === stringOne)) {
            // do other things I omit (same identical things as in the function parseAll
        }
    }
}

3番目のオプションarguments.lengthは、実際に関数に渡された引数の数を確認することです(すべての関数はarguments、呼び出し中にスコープ内にオブジェクトを持っています)が、一部のJavaScriptエンジンでは、呼び出しを劇的に遅くする可能性があります(通常は本当に重要な方法)、そしてそれはここでは本当に必要ではありません。

于 2013-02-16T10:07:31.327 に答える