2

最近、私は自分の会社で生産コードがクロージャー関数で返されるのを見てきました。そして、私はこれreturn (function() {...}()); を見るのが好きではありませんが、私は信頼できる情報源ではありません. なぜ、いつ、これを使用するのが良いか悪いかを StackOverflow に尋ねてみようと思いました。

* ノート *

これらの関数はすべて既に閉鎖されているため、名前空間の汚染について心配する必要はありません。

例1a:

function foo(bar) {
    return {
        x: 1 + bar,
        y: 1 - bar,
        duration: (function() {
            var i = 0,
                len = 5;
            var results = 0;

            for (; i < bar; i++) {
                results += 1 + (results * bar);
            }

            return results;
        }())
    };
}

例1b:

function barProcess(bar) {
    var i = 0;
    var len = 5;
    var results = 0;

    for (; i < bar; i++) {
         results += 1 + (results * bar);
    }

    return results;
}

function foo(bar) {
    return {
        x: 1 + bar,
        y: 1 - bar,
        duration: barProcess(bar)
    };
}

例1c:

function foo(bar) {
    var i = 0;
    var len = 5;
    var results = 0;

    for (; i < bar; i++) {
         results += 1 + (results * bar);
    }

    return {
        x: 1 + bar,
        y: 1 - bar,
        duration: results
    };
}

観察:

例 1a:
内部関数は、必要に応じてクロージャを利用します。

例 1b:引数リストが長くなり、維持するのが困難になる可能性のあるクロージャーが必要になる
場合があります。barProcess

Example1c:
呼び出しごとに余分な関数が作成されることはありません。デバッグするのが最も簡単です(私の意見では)。

例 a、b、または c を使用する必要がある理由について、技術的な理由を教えていただければ幸いです。


だから、私の不自由な答えは私を満足させなかったので、私はこれを試しました. JS パフォーマンス テスト. これは、私の観察がそれほど遠くないものになると思います。

4

2 に答える 2

0

すべての単純なケースについて、例 a、b、c の間で明確な勝者を選択することは不可能だと思います。

あなたが与える例では、バージョン(c)で十分なので、それを使います。とは言っても、バージョン (a) は i、len、および結果の veriables をさらに狭い範囲に保持するため、「x」と「y」を期間「b」からさらに分離したい場合は、間違いなく良い方法になる可能性があります。

例 (b) で行ったように、組織やスコープの理由だけで、物事を個別の名前付き関数に分割することは好きではありません。コードがより複雑になり、追跡が難しくなる傾向があるためです。ただし、barProcesses が実際に再利用可能な抽象化であり、明確な名前を付けることができる場合は、それを分離しておくことをお勧めします。

これらの関数はすべて既に閉鎖されているため、名前空間の汚染について心配する必要はありません。

ここであなたは少し誇張していると思います。内側の IFFE は、外側の IFFE のように 100% 推奨されるわけではありませんが、スコープをさらに制限してもまったく問題ありません。同僚と争う価値はないと思います。

于 2013-05-17T22:28:11.187 に答える