gpt4 book ai didi

Javascript 闭包和堆栈展开

转载 作者:行者123 更新时间:2023-11-30 12:11:58 25 4
gpt4 key购买 nike

我正在尝试深入理解 java 脚本的闭包概念。

function foo(){
let temp = 5;
let bar = function _bar(){
console.log('temp:=', temp);
}
return bar;
}

let ref2Bar = foo();
ref2Bar();

o/p:
temp:=5

从上面的示例代码片段来看,bar() 比 foo() 更接近。 ref2Bar 得到 bar() 的引用,从全局范围执行它可以访问 foo() 的词法范围。

现在我正在处理堆栈绕组和解绕的问题。当 foo() 完成时,它应该从堆栈中弹出,但由于 bar() 的引用在此文件的生命周期内处于事件状态,听起来 foo 作用域仍然可以访问。我很好奇这是如何处理的。另外,如果有更多的闭包,内存不足的可能性会更大吗?

最佳答案

When foo() is complete, it is supposed to be popped out of stack

是的,它不再活跃。

but as the reference of bar is active in the lifetime of this file, it sounds like the foo scope is still accessible.

确实如此。

I'm very curious to know how this is handled

包含封闭变量的变量环境(“范围”)需要分配在堆上,而不是堆栈上。从调用堆栈弹出的执行上下文(“堆栈帧”)仅包含指向它的指针。
因此,在 _bar/ref2bar 对它的引用被销毁之前,变量环境不会被垃圾回收。

Also, if there are more closures, will there be a fair chance of running Out Of Memory?

是的,每个闭包都是一个对象并且占用内存空间。如果您创建许多闭包来关闭具有大值的变量,您确实会导致内存泄漏。不过,我不会称之为“公平的机会”,你需要非常非常多的或非常非常大的。

关于Javascript 闭包和堆栈展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33504625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com