1

私はよく、次のように、作成された場所で呼び出される多くの無名関数で構成されるJavascriptコードスニペットに出くわします

var prealloc = (function() {
    // some definitions here

    return function prealloc_win(file, size, perms, sparseOk) {
        // function body
    };
})();
// can be called like this:
prealloc(...);

したがって、これは別の関数を返す無名関数を呼び出しますprealloc_win。私には、これは、結果のオブジェクトが関数を公開するクラスをインスタンス化することと同じように見えますprealloc_win

function preallocObj() { 
    // some definitions here  
    this.prealloc_win = function(file, size, perms, sparseOk) {
        // function body
    }; 
}
prealloc = new preallocObj();
// can be called like this:
prealloc.prealloc_win(...);

この仮定は正しいですか?直接呼び出される無名関数を使用する利点は何ですか?そして、なぜこのイディオムはJavascriptで頻繁に見られますが、同じ方法で記述できる他の言語(C、C ++、Python)ではあまり見られないのですか?

4

3 に答える 3

1

あなたはほとんど正しい考えを持っています。このモジュールパターン/関数ビルダーの利点は、結果の関数がそれ自体の内部定義または状態を囲むことができることです。

これは基本的に、プライベート変数または定数を使用して関数を作成する方法にすぎません。効率の悪い代替案を検討してください。

var prealloc = function() {
  // some definitions here
  // function body
}

この関数が呼び出されるたびに、変数が再割り当て/インスタンス化され、不要なパフォーマンスオーバーヘッドが追加され、以前の呼び出しから生じた状態データが上書きされます。

このメソッドは、プライベートアクセスのみが必要な関数の動作に重要な変数がある場合、または外部スコープを汚染することなく呼び出し間で永続化する必要がある変数がある場合に役立ちます。

于 2012-07-15T15:57:39.687 に答える
1

取り決めは、preallocObjこれは複数回インスタンス化できるものであるとクラスが言っていることです。それが実際にはそのために設計されていなくても、私はそれのより多くのインスタンスを作成することができました。それを防ぐためにいくつかのハックを行うことができますが、これにはすぐに呼び出される匿名関数を使用する方が簡単です。

すぐに作成されて呼び出される無名関数を使用すると、「クラス」が作成され、即座に「インスタンス化」されて割り当てられます。この後、オブジェクトpreallocを作成した元の無名関数を参照する方法はありません。preallocそれは作成され、呼び出され、失われました。

于 2012-07-15T19:29:05.847 に答える
0

Javascriptは、C ++、JAVA、Pythonとは根本的に大きく異なり、異なる方法で記述する必要があります。繰り返されるリスクがありますが、JavascriptはOOP言語ではなく、プロトタイプ言語です。 YahooのDouglasCrockford(JSONの発明者)には、いくつかのすばらしい記事と、特に「Javascript-良い部分」というタイトルのビデオがあります。

于 2012-07-22T15:56:25.233 に答える