3

クロージャ内にいくつかのプライベート変数を隠そうとしているコードに取り組んでいます。重要なのは、環境がメモリに関してかなり制約されていることです。そのため、クラスの全体的なフットプリントを低く抑えることにも関心があります。

オブジェクト上のすべてのメソッドと変数をパブリックにするだけの場合と比較して、クロージャを使用してプライベートインスタンスの変数とメソッドを非表示にすることの影響は何ですか?クロージャを使用しているインスタンスは、クロージャを使用していないインスタンスよりも多くのメモリを消費しますか?もしそうなら、私はどれだけ多くのメモリを使用すると予想しますか?

私のコードは次のようになります

function Foo() {
   // private variables
   var status = 3;
   var id = 4;
... 
...

   // private methods
   var privateMethod = function () {
      // do something awesome
   }
   ...

   // a whole bunch of these


   // public methods

   this.publicDriver =  function () {
        privateMethod();
   }
    .. a few more of these

};

function Bar() {
   // only define public variables
   this.x = 1;
   this.y = 3;
}

Bar.prototype.method1 = function () { 
// blah;
}

....続けて、残りのすべてのメソッドを定義します。

4

4 に答える 4

1

さて、私が見る限り、クロージャーケースを使用してクラスを構築すると、コンストラクター内で定義されたメソッドごとに新しい関数オブジェクトが構築されますが、プロトタイプの割り当て方法では、オブジェクトのすべてのインスタンスによって共有される中心的な関数が作成されます。次に、中央インスタンスは、適切なインスタンス変数参照のためにオブジェクトごとに解釈されます。

クロージャーの例で定義されている各関数は、同じスタック フレームを参照していると思います。

それでも、私の場合は、より多くのオブジェクトが浮かんでいます。

于 2010-02-11T01:28:14.767 に答える
0

クロージャで囲まれた変数がJavaScriptのクロージャの外部から更新できるという事実は、変数のコピーが1つしかないことを示唆しています。つまり、JavaScriptでクロージャを使用することによるメモリへの重大な影響があるはずの理由はありません。

クロージャーが作成された後で変数の値が凍結された場合、各クロージャーには囲まれた変数のプライベートコピーが必要になるため、これは別の話になります。

そうは言っても、実際のベンチマークを実行して確認する必要があります:-)

于 2010-02-11T15:34:37.560 に答える
0

次のリンクは、JavaScript関数をプロファイリングしてパフォーマンスに関する情報を確認するためのヒントに関する情報を示しています。

http://ejohn.org/blog/function-call-profiling/

于 2010-02-10T19:12:31.273 に答える
0

これらのベンチマークを確認してください。これらは継承のベンチマークですが、クロージャを使用するものと使用しないものがあるため、メモリへの影響を把握できるはずです。

于 2010-02-10T19:14:32.630 に答える