在我目前对javascript对象模型的理解中,构造函数中定义的所有变量都成为您使用构造函数创建的对象的成员。例如:
function A() {
this.memberA = 0; //memberA is now a property of A;
var memberB = 1; //memberB is now a private member of A, it can only be accessed by functions defined in the constructor
this.getMemberB = function() {
return memberB;
}
}
var a = new A(); //object of A now exists
然而,这至少在我的理解中暴露了一个问题。假设我想在构造函数中进行一些操作并暂时存储它们。
function A() {
this.memberA = 0; //memberA is now a property of A;
var memberB = 1; //memberB is now a private member of A, it can only be accessed by functions defined in the constructor
this.getMemberB = function() {
return memberB;
}
var calculation = /* some complex operation that I don't want to put on a single line, like I'm doing now for simplicity*/
this.memberC = calculation;
}
根据我的理解,var calculation
不会成为A级成员,虽然是私人的,但只要A的实例存在,它就会存在,会占用记忆。
我的问题是,如果我的理解是正确的,我怎么能确保在执行结束时忘记构造函数中声明的变量,从而释放内存。
答案 0 :(得分:2)
首先,您的第一个代码块中存在小错字:
var a = A(); //it is incorrect, you should use
var a = new A();
关于构造函数中的var
,这些变量对于构造函数的作用域是本地的,如果你不在某些闭包中使用它,它将被销毁(它是使用外部作用域的变量的函数)。
例如在你的第一个代码中有局部变量memberB
,在正常情况下应该销毁它,但getMemberB
函数在函数体内使用它,所以在getMemberB
之前它不能被销毁还活着。
因此,如果没有人使用它们,那么在构造函数中创建的所有局部变量都将被销毁并释放内存。