Я пытаюсь понять 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' имеет доступ к переменным 'grandpa' и 'Father' '
Насколько я понимаю, JS стек вызовов следует за Концепция первого в последнем из (или, скажем, последний в первом из). Таким образом, если стек вызовов следует за LIFO, то почему a () выталкивается из стека до c (), разве сначала не должно выталкиваться c (), затем b () и затем a () ??
Мне кажется, что объяснение закрытия здесь противоречит пониманию моего стека вызовов.
Буду признателен, если кто-нибудь сможет объяснить этот пример закрытия вместе со стеком вызовов?