Javascript构造函数模式和垃圾收集器

时间:2014-12-17 19:43:55

标签: javascript design-patterns constructor garbage-collection durandal

我在基于Durandal的SPA中使用以下构造函数。 (我也在Durandal google小组中问了这个问题,还没有回复)。当用户导航到页面时,Durandal框架可以控制此视图模型的“新”。

function () {

 var ctor = function () {

     this.arr1 = [];
     var arr2 = [];

     this.getData = function () {

         for (i = 0; i < 1000000; i++) {
             this.arr1.push ({ empName: "mike", empAge: 30, empTitle: 'Senior Software Engineer' });
             arr2.push      ({ empName: "mike", empAge: 30, empTitle: 'Senior Software Engineer' });
         }

         alert("done");
     }      
};

return ctor;

});

点击视图按钮会触发getData。 在填充数组并导航之后,arr1中的对象被垃圾收集。 arr2中的对象不是。

我正在尝试使用“var”而不是“this”,因为我读到了一些关于在此模式中创建私有变量的文章。混合“var”和“this”有什么缺点吗?

JS GC是否应该清理这两个阵列?如果是的话,我可以把更多的注意力集中在Durandal身上。

使用Chrome开发工具中的配置文件进行测试

1 个答案:

答案 0 :(得分:0)

只要包含的对象可用于GC,垃圾收集器就会清除您的数据,无论它是在本地(例如私有)变量还是在实例变量中。它没有与那个观点有所不同。

私有变量很有用,也是一种完全可以接受的代码编写方式。它们要求所有访问它们的方法都在构造函数中定义,就像定义了.getData()方法一样。您不能将原型用于需要访问构造函数中定义的私有变量的方法,因为原型上的方法属于不同的范围。

您可以在此处详细了解私有成员变量设计模式:http://javascript.crockford.com/private.html