Javascript 用调用堆栈理解闭包

Javascript 用调用堆栈理解闭包,javascript,closures,callstack,Javascript,Closures,Callstack,我试图理解javascript闭包与javascript中调用堆栈的关系 我遇到了一个闭包的例子,它是 function a() { let grandpa = 'grandpa' return function b() { let father = 'father' return function c() { let son = 'son' return `${grandpa} > ${father} > ${son}` }

我试图理解javascript闭包与javascript中调用堆栈的关系

我遇到了一个闭包的例子,它是

function a() {
  let grandpa = 'grandpa'
  return function b() {
    let father = 'father'
    return function c() {
      let son = 'son'
      return `${grandpa} > ${father} > ${son}`
    }
  }
}

let x = a();
let y = x();
y();
现在根据我对调用堆栈的理解,当我们调用函数a()时,它会被推到堆栈中,然后当我们运行函数“b”时,它会被推到“a”上,然后函数“c”被推到“b”上。所以我觉得应该是这样的

然而,我在这个例子中看到的解释显示了闭包所说的:-

“当我们调用函数‘a’时,我们得到的是函数‘b’,在返回‘b’后,函数‘a’从堆栈中弹出,因此它的可变环境被删除(垃圾收集的概念——标记和清除算法)。 但函数“c”仍然可以访问变量“爷爷”和“爸爸”

根据我的理解,JS调用堆栈遵循先进先出(或者说后进先出)的概念。 那么,如果调用堆栈遵循LIFO,那么为什么a()在c()之前从堆栈中弹出,不应该先弹出c(),然后弹出b(),然后弹出a()

我觉得这里的闭包解释与我对调用堆栈的理解相反


如果有人能解释这个闭包示例以及调用堆栈,我将不胜感激

因为
a()
已完成执行。一旦完成,它将从调用堆栈中删除-完成。当您调用
b()
(通过
x()(
)时,您正在执行一个新的函数调用,该函数调用完成并返回
c
(将其分配给
y
)@VLAZ因此,如果函数已经完成了执行,那么即使它已经首先进入堆栈,它也会被删除??您能否确认,如果我对堆栈的理解是正确的??堆栈是LIFO,是的。如果您有类似
a=()=>b()
的内容,则调用
a()
a
推到堆栈中,然后
b
一旦
b
被解析,你就回到
a
的堆栈帧,一旦完成,你就回到上一个堆栈帧(如果有)。然而,你实际上有
a=()={}
b=>{}
然后依次调用它们,这样就不会得到嵌套的堆栈帧。因为
a()
已完成执行。一旦完成,它将从调用堆栈中删除-完成。当调用
b()
(通过
x()(
)时,您正在执行一个新的函数调用,该调用将完成并返回
c
(将其分配给
y
)@VLAZ因此,如果函数已完成执行,即使它已首先进入堆栈,它也将被删除??您能否确认,如果我对堆栈的理解是正确的??堆栈是LIFO,是的。如果您有类似
a=()=>b()
的内容,则调用
a()
a
推到堆栈中,然后
b
一旦
b
被解析,你就回到
a
的堆栈帧,一旦完成,你就回到上一个堆栈帧(如果有)。然而,你实际上有
a=()={}
b=>{}
然后依次调用它们,这样就不会得到嵌套的堆栈帧。