6

次のようにクロージャーを使用している関数があります。

function myobject() {
  var width=300,
      height=400,
      bigjsondata = { } // assume this is a big variable ~ 300k

  function obj(htmlelement) {
     // plot a graph in this htmlelement based on bigjsondata
  }

  return obj;
}

var plot1 = myobject();
plot1('#holder1');

var plot2 = myobject();
plot1('#holder2');

変数bigjsondataには大きなデータセットが含まれています。bigjsondata問題は、変数を作成するたびにメモリを割り当てるvar a = myobject()かどうかです。

多くのインスタンスが作成されると、メモリの問題が発生する可能性がありますか?

もしそうなら、それを一度だけロードする最良の方法は何ですか? (bigjsondata変わらない)

編集:最後に、myobjectグローバルにアクセスできるようにしたいと思います。

4

3 に答える 3

3

何を達成しようとしているのかわからない場合、これにより、さまざまなレベルでプライベートストレージが提供されるはずです。

var privateStorage = function () {
  // only 1 copy total
  var bigJsonData = {...}
  return function() {
    // 1 copy for each instance
    var instanceData = {...}
    return function() {
          // something to do many times per instance
          return something_useful
    }
  }
}(); // returns function that privatelly knows about bigJsonData

var a = privateStorage(); // a is now 1st instance of the inner-most function
var b = privateStorage(); // a and b share the SAME bigJsonData object, but use different instanceData objects

a1 = a();
a2 = a();
于 2013-04-11T18:12:47.010 に答える
1

これにはオブジェクト指向のアプローチを採用することをお勧めします。

function obj (htmlelement)
{
    this.htmlelement = $(htmlelement);    
}

obj.prototype.htmlelement = null;
obj.prototype.bigjsondata = {};
obj.prototype.width = 300;
obj.prototype.height=400;

obj.prototype.plot = function ()
{
   var htmlelement = this.htmlelement;
   var bigjsondata = this.bigjsondata;
   var width = this.width;
   var height = this.height;
   //plot graph here;
}

var plot1  = new obj('#holder1');
var plot2 = new obj('#holder2');
plot1.plot();
plot2.plot();

ここでは、同じ bigjsondata が obj のすべてのオブジェクト間で共有されます。

于 2013-04-11T18:20:26.423 に答える