【发布时间】: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