避免var?

时间:2016-11-05 16:28:03

标签: javascript performance memory-management

我们假设我有一个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倍吗?

2 个答案:

答案 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。