是否引用了JavaScript闭包变量,或者它们包含自己的副本?

时间:2018-10-13 19:13:03

标签: javascript closures

我最近一直在阅读闭包,有些困惑,因此有一些疑问。

因此,我认为闭包是指您在函数中使用的变量位于直接词法作用域之外的某个位置。我经常听到的另一个定义是:“保持变量的副本有效,就像在函数完成执行之前一样”。

所以可以说我有一个带有私有变量的函数:

function foo() {
    var x = 'abc';
    return function() {
        return x;
    }
}

var bar = foo();
console.dir(bar) // [[Scopes]] - 0: Closure { x: 'abc' }

当我使用console.dir并检查闭包中的内容时,我能够看到属性x的值为'abc'。

我对于在父级(外部)函数变量被丢弃并立即在JavaScript中立即垃圾回收(.. i承担)时x如何在内部函数内保持“活跃”状态感到有些困惑。父函数已执行。

因此,当我将内部函数定义返回到变量栏时,我会假设它也包含一个引用并也形成了闭包? (也许我错了,这是我感到困惑的地方。)

当我形成一个闭包并且该闭包包含来自其父级范围的变量时,它是否会创建此变量的新副本并将其存储在闭包中,还是只是从函数外部引用该变量并修改其值?因为我认为一旦执行父函数,变量“ x”就会被丢弃?

很抱歉这个愚蠢而漫长的问题,但是如果有人可以帮我解决这个问题,那就太好了。

2 个答案:

答案 0 :(得分:0)

这实际上是一个关闭。您的函数作用域继承了它的外部作用域,后者也继承了它的外部作用域,依此类推。如果在您的作用域中使用外部作用域中的任何变量,那么JS引擎会增加该变量的引用计数器,这就是为什么垃圾回收器不会删除它的原因(它会删除不再引用的变量,即引用计数为0)。

答案 1 :(得分:0)

内部功能/盒盖包含对外部功能/盒盖的引用。当您返回变量x时,它将从仍然存在的外部闭包中查找其值。