【问题标题】:Are JavaScript closure variables referenced or do they contain their own copy?是否引用了 JavaScript 闭包变量,或者它们是否包含自己的副本?
【发布时间】:2019-03-18 16:19:47
【问题描述】:

我最近一直在阅读关于闭包的文章,有点困惑,因此有几个问题。

所以我想到了一个闭包,只要你在一个函数内部使用一个变量,这个函数位于你直接词法范围之外的某个地方。我经常听到的另一个定义是..'保持变量的副本,就像函数完成执行之前一样'。

假设我有一个带有私有变量的函数:

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如何在内部函数中保持“活动”感到有些困惑。父函数已执行。

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

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

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

【问题讨论】:

    标签: javascript closures


    【解决方案1】:

    这实际上是一个闭包。你的函数作用域继承了它的外部作用域,它继承了它的外部作用域等等。如果在您的范围内,您正在使用来自外部范围 JS 引擎的任何变量,则该变量的引用计数器会增加,这就是垃圾收集器不会将其删除的原因(它会删除不再引用的变量,即引用计数为 0)。

    【讨论】:

      【解决方案2】:

      内部函数/闭包包含对外部函数/闭包的引用。当你返回变量 x 时,它会从仍然存在的外部闭包中查找它的值。

      【讨论】:

      • 如果有人可以在此发布一些文档,那也会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 2016-04-25
      • 2018-05-12
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多