我们假设我有一个MyClass
课程,其功能method()
将被称为很多。哪些实现会更有效?
function MyClass() {
this.method = function () {
var number = 10;
var boolean = true;
var string = "string";
// do something
};
}
function MyClass() {
this.data = {};
this.method = function () {
this.data.number = 10;
this.data.boolean = true;
this.data.string = "string";
// do something
};
}
第一个实现创建了新的变量,这些变量在执行函数后有资格进行垃圾收集,因为它们没有引用它们,这很好。但是,如果我调用该函数3次,则会分配总共3个数字,3个布尔值和3个字符串的内存。
第二个实现不会创建新变量,而只是覆盖函数的前一个调用的值。这是否意味着在3次调用函数后,分配的内存只是1个数字,布尔和字符串,而不是3?消耗的内存真的减少了3倍吗?
答案 0 :(得分:0)
function MyClass() {
this.method = function () {
var number = 10;
var boolean = true;
var string = "string";
// do something
};
}
第一种方法更好,因为变量是方法范围,一旦方法执行完成,将由GC收集。但请记住,如果您必须将这些值保留为类成员,则此方法将无效。
在第二种方法中,您将使用类引用附加这些属性。因此,在使用某个范围引用类实例之前,GC不会收集它。
答案 1 :(得分:0)
您的第二种方法看起来非常符合逻辑且可访问。我相信代码是诗意的,它讲述了持久性。
function MyClass() {
this.data = {};
this.method = function () {
this.data.number = 10;
this.data.boolean = true;
this.data.string = "string";
// do something
};
}
上述代码看起来效率高,结构合理,而不是每次调用类时都创建更多var。