我在基于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开发工具中的配置文件进行测试
答案 0 :(得分:0)
只要包含的对象可用于GC,垃圾收集器就会清除您的数据,无论它是在本地(例如私有)变量还是在实例变量中。它没有与那个观点有所不同。
私有变量很有用,也是一种完全可以接受的代码编写方式。它们要求所有访问它们的方法都在构造函数中定义,就像定义了.getData()
方法一样。您不能将原型用于需要访问构造函数中定义的私有变量的方法,因为原型上的方法属于不同的范围。
您可以在此处详细了解私有成员变量设计模式:http://javascript.crockford.com/private.html