考虑以下 Javascript 函数 (1):

function setData(domElement) {
  domElement.myDataProperty = {
    'suppose': 'this',
    'object': 'is',
    'static': 'and',
    'pretty': 'big'
  };
};

现在我不喜欢这个函数的是每次调用该函数时都会创建完全相同的对象。由于该对象不会改变,我宁愿只创建它一次。因此我们可以进行以下调整(2):

var dataObject = {
  'suppose': 'this',
  'object': 'is',
  'static': 'and',
  'pretty': 'big'
};

function setData(domElement) {
  domElement.myDataProperty = dataObject;
};

现在,该对象在脚本加载并存储在中时创建一次 dataObject. 。但我们假设 setData 仅偶尔被调用——大多数时候加载脚本时该函数都不会被使用。在这种情况下,我不喜欢这个函数的是,对象总是被创建并保存在内存中,包括许多永远不会使用它的场合。我想你可以这样做来达到理想的平衡(3):

var dataObject;

function setData(domElement) {
  if (!dataObject) {
    dataObject = {
      'suppose': 'this',
      'object': 'is',
      'static': 'and',
      'pretty': 'big'
    };
  }
  domElement.myDataProperty = dataObject;
};

这有意义吗?我认为这取决于解释器决定创建对象的时间。难道真的要等到过了 !dataObject 条件,或者它进入函数,尝试聪明并决定提前构造它?也许不同的 Javascript 引擎对此有不同的政策?

当然,还有一个问题是这些优化在实践中是否重要。显然,这取决于物体的大小、引擎的速度、可用资源量等因素。但总的来说,您认为哪一项是更重要的优化:从(1)到(2)还是从(2)到(3)?

有帮助吗?

解决方案

答案是,你不应该知道。您展示的示例之间几乎没有什么区别。您合理担心这一点的唯一方法是,如果您有实际证据表明某种方式明显损害了特定解释器的性能或内存使用情况。在那之前,口译员的工作就是为您担心这些事情。

也就是说,如果你真的想知道......尝试一下就知道了。调用不同版本 1,000,000 次,看看有什么不同。

制作一个巨大的物体,看看是否会产生凹痕。观看任务管理器。尝试不同的浏览器。报告您的结果。这是一个比仅仅在互联网上询问一群混蛋他们猜测可能发生的情况更好的方法。

请记住,无论如何,对象都必须位于内存中......作为 源文本

其他提示

必须创建一个新的对象 - 它不能没有,部分原因是因为该规范要求它,但主要是因为替代的行为将是与直觉相反,采取:

function f() {
    return {a : "b", c: "d"};
}
o=f();
alert([o.c, o.e]); // Alerts "b,"
delete o.c;
o.e="f";
o=f();
alert([o.c, o.e]); // If the object was only created once this would produce ",f"

你真的希望一个新的对象表达实际上并不产生你问的对象?因为这是你似乎什么希望。

可以想象你只想做:

var myFunction = (function(){
    var object = {a: "b", c: "d"};
    return function() { return object; }
})();

这将得到你想要的效果,但你必须意识到你返回对象是可以改变一个完全可变对象,每个人都将共享相同的变异情况。

首先,我要实现它在情况#2和一旦立即页面加载之后加载。

如果有一个与网页速度的问题,我会衡量页面内特定任务所花费的时间。

如果它是建立(相对而言)的对象非常昂贵,那么我会移动到情况#3。

有没有在不加点的“如果”语句,如果它真的不买任何东西...在这种情况下,创建一个简单的/大对象是无汗了你的CPU的背上。如果没有测量,你不优化 - 你只是盲目的拍摄

这实际上是初始化的事情相当普遍的方法,我已经用C亲自使用++和Java。

首先,这种优化将永远不会在实践中关系。

其次,最后功能是完全一样的第一功能一样好。好了,差不多了。在第一个我想你是在垃圾收集器,当你重新分配domElement.myDataProperty应该销毁旧的对象的摆布。不过,不知道垃圾回收器是如何工作的目标平台上(它可以是跨浏览器非常不同的),你不能确定你保存任何工作,真的。

尝试他们三个都在几个浏览器,并找出哪些是更快的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top