2013-03-12 98 views
2

我正在构建一个基于JavaScript的浏览器的Web应用程序。管理Javascript内存中变量的最佳方式是什么

当我需要位于分隔文件的模块,我不知道是哪三个方法是关于由JavaScript引擎所采取的内存最好:

理念1分配变量的延伸方法在instanciation方法

function (ContactCollection , ItemCollection, ContactListView) { 
    var ContactExample = function (inst) { 
     // Wild examples of possible uses : 

     this.collections.contact.each(function(model) { 
      // do something with each model 
     }); 

     this.collections.item.on('reset', this.resetItems, this); 

     this.$el.remove().append(this.view.render().el); 
    }; 

    jQuery.extend(true, ContactExample.prototype, { 
     'collections': { 
      'contact': ContactCollection, 
      'item': ItemCollection 
     }, 
     'view': ContactListView, 
     '$el': jQuery('#somediv'), 
    }, ContactExample); 

    return new ContactExample(); 
}; 

思想2分配变量:

function (ContactCollection , ItemCollection, ContactListView) { 
    var ContactExample = function (inst) { 
     // Wild examples of possible uses : 

     inst.collections.contact.each(function(model) { 
      // do something with each model 
     }); 

     inst.collections.item.on('reset', this.resetItems, this); 

     inst.$el.remove().append(this.view.render().el); 
    } 

    jQuery.extend(true, ContactExample.prototype, { 
     '$el': jQuery('#somediv') 
    }, ContactExample); 

    return new ContactExample({ 
     'collections': { 
      'contact': ContactCollection, 
      'item': ItemCollection 
     }, 
     'view': ContactListView 
    }); 
}; 

理念3只需在代码中使用它们,因为它们在功能的范围已经引用:

function (ContactCollection , ItemCollection, ContactListView) { 
    var ContactExample = function (inst) { 
     // Wild examples of possible uses : 

     ContactCollection.each(function(model) { 
      // do something with each model 
     }); 

     ItemCollection.on('reset', this.resetItems, this); 

     this.$el.remove().append(ContactListView.render().el); 
     } 
    }); 

    jQuery.extend(true, ContactExample.prototype, { 
     '$el': jQuery('#somediv') 
    }, ContactExample); 

    return new ContactExample(); 
}); 

什么(为什么)是处理的最佳方式javascript内存引擎中的变量。

谢谢你的回答

+5

可以去除backbone./require代码,然后创造一个一般性的问题?这对其他人更有帮助,你会得到更多的回应。 – 2013-03-12 10:25:22

+0

我的建议是从头开始使用可靠的骨干教程,例如http://net.tutsplus.com/sessions/build-a-contacts-manager-using-backbone-js/或许还有助于完成JavaScript引用,如果你的背景是另一种技术,例如https://developer.mozilla.org/en-US/docs/JavaScript/Memory_Management – ricksuggs 2013-04-08 14:26:48

+0

'jQuery.extend'不能像Backbone.View一样使用。 extend'。您的问题目前无法解答,因为它已被破坏。 – 2013-04-10 09:56:16

回答

1

最低的内存使用您的三个选项是使用上下文变量(想法#3),因为它消除了重复。其他两个将值复制到该函数内创建的第二个对象。以下是背景:

JavaScript中的所有内容都是一个对象,对象在内部只是将字符串键与其实际值相关联的hashmaps。这包括普通的局部变量;在内部它们是一个不可见的上下文对象的属性,可以被该函数及其内部定义的任何函数访问。直接使用$ .extend和赋值属性没有区别,因为extend函数只是一个for循环的语法糖,它将属性从一个对象复制到另一个对象。由于一个函数的上下文(局部变量)对象被其中定义的所有函数保留以供其使用,所以选项的最低内存使用量将不会将其复制到新的内部对象中。但差别不大。

如果你真的想减少你的内存使用量到最小的水平,并编写易于维护的代码,我建议摆脱花式(和难以调试)的上下文环绕和编码旧的老式的JavaScript OOP方式:使用一个普通的构造函数,这个构造函数在顶层或者在一个包装函数中定义,这个函数在页面第一次加载时只运行一次。这摆脱了重复的上下文。使用'new'关键字调用它,并将数据作为您分配给'this'的参数传入。在构造函数中进行初始化,除此之外。

将所有的方法函数放在它的原型上,然后用它作为一个普通的普通的无装饰的JavaScript对象。

https://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-Oriented_JavaScript

+0

很好的答案,正是我在找的东西。关于最后一部分,这个“设计”是必需的,因为我使用了RequireJs(因此是根函数)和Backbone(因此扩展,这里用jQuery替代为更广泛的方法)。 – 2013-04-11 07:19:03

+0

如果您使用RequireJS模块作为每次需要新对象时调用的构造函数,那么该样式很有意义。这也是最糟糕的记忆方式,因为您现在已经在每个子对象上定义了重复的原型。 (在普通的JavaScript OOP中,共享原型被定义了一次,子对象只包含它们改变的属性以及对其原型的单一引用。)通常我会看到人们在模块中定义了构造函数和原型并返回,然后返回在他们的代码的其余部分正常的OOP方式。 – 2013-04-11 14:52:44

+0

我为我的共享原型做了这个(就像在“列表”页面或“详细信息”页面中使用的相同函数一样,并且我扩展了这个原型,并具有任何列表或细节的特定功能)。 – 2013-04-11 17:38:38

0

为什么你使用$ .extend?只需创建一个实例,并指定属性:

var c = new ContactExample(); 
c.$el = $('#somediv'); 

内存不会是一个问题 - 而不是集中在引用DOM元素(#somediv)以后可能会导致麻烦。

+0

我使用$ .extend是因为我重新创建了一个类似于Backbone的实例化Backbone对象的环境。我的问题是针对这3个用例中内存使用情况的不同,我知道它与DOM元素内存泄漏不同,但这不是问题的关键。 – 2013-04-08 15:01:16

0
  • 常量

    • 如果您不需要它们的功能范围之外,然后用正常变量。

    • 如果您需要它们超出函数的范围,则将它们放在构造函数中。

  • 实例变量(每个实例变化)

    • 对于您知道将有每个实例不同的值,在构造函数中使用正确的类型声明它们的属性,使他们能够被优化成与构造函数关联的静态类型。

    • 对于在所有对象(如方法)之间共享的属性,请使用原型。

    • 对于更可能保持其默认值的属性,如果您想要访问速度,您应该在构造函数中声明它们,但如果要使用更少的内存,则应该将默认值放在构造函数中并且只有在对象与默认值不同时才添加属性。

相关问题