Javascript闭包对象生命周期

Javascript闭包对象生命周期,javascript,closures,Javascript,Closures,这是在闭包内创建局部对象的代码 function A() { this.welcome = "Welcome"; } var P = (function() { var a = new A(); function printa() { console.log(a); } return { printa: printa }; })(); P.printa(); 它打印: { welcome: 'Welcome'

这是在闭包内创建局部对象的代码

function A() {
    this.welcome = "Welcome";
}

var P = (function() {
    var a = new A();
    function printa() {
        console.log(a);
    }
    return {
        printa: printa
    };
})();


P.printa();
它打印:

{ welcome: 'Welcome' }
在p=。。。函数执行时,P获取一个新对象,该对象保存对函数printa的引用,但此时应释放局部变量a。为什么它没有被释放?
或者它暂时存在是因为它不是垃圾收集的?

有一条规则:如果某个变量被某个范围持有,那么它就不是自由变量。在您的示例中,printa函数的作用域使用变量a。

有一条规则:如果某个变量被某个作用域持有,那么它就不是自由变量。在您的示例中,printa函数的作用域使用变量a。

a由printa函数的闭包引用

a将在不再引用printa函数一段时间后被垃圾收集。

a被printa函数的闭包引用

a将在不再引用printa函数后的一段时间内被垃圾收集。

a将始终存在于函数printa创建的闭包之外。a仍然在printa的作用域链中,因此它不会被释放,也就是说,直到不再有对printa的引用时才会被垃圾回收

然而,垃圾收集在不同的浏览器IE6 any?上有所不同,所以所有的赌注都集中在垃圾收集的确切时间上。

a始终存在于函数printa创建的闭包之外。a仍然在printa的作用域链中,因此它不会被释放,也就是说,直到不再有对printa的引用时才会被垃圾回收


然而,垃圾收集在不同的浏览器IE6中有所不同,所以所有人都会打赌它将在什么时候被垃圾收集。

这是否意味着一个函数实际上可以保存其中提到的所有变量,即使不执行它?这使得函数更像一个数组或字典。这是否意味着一个函数实际上可以保存其中提到的所有变量,即使不执行它?这使得函数更像一个数组或字典。我的观点是,尽管printa提到了a,但它在返回时并没有执行。所以printa不应该保留对a的引用是有意义的,因为它是一个函数,而不是一个字典。我的观点是,尽管printa提到了a,但它在返回时并没有执行。所以printa不应该保留对a的引用是有意义的,因为它是一个函数,而不是一个字典。否则,即使未执行,它也需要保存所有外部变量。