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

通常 - 是的,您的代码看起来就像bigjsondata每次创建一个新实例一样new myObject();要解决这个问题,您可以使用这样的匿名初始化函数:

myObject = null;

(function() {
     var bigjsondata = { ... } // construct you large object here;

     function myObjectInternal() {
         // you can access `bigjsondata` from here.
         // do not change `bigjsondata`, since it will now 
         // use the changed value in all new instances of `myObjectInternal`
     }
     myObjectInternal.prototype = {
         data: function(_) {
             // you can access `bigjsondata` from here too
         }
     };

     myObject = myObjectInternal;
})();

这将创建一个匿名函数,该函数会立即且仅调用一次(如单例)。在函数内部,bigjsondata是函数的一个闭包myObjectInternal,它只在匿名函数中可见。这就是您定义外部全局变量的原因myObject,以使其指向myObjectInternal 函数/对象。

按照您的意愿定义myObjectInternal,您就可以myObject开始了。因此,在以下代码中:

var instance1 = new myObject();
var instance2 = new myObject();

它将使用相同bigjsondatainstance1instance2

于 2013-04-11T17:54:41.370 回答
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 回答