我正试图深入理解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作用域仍然可访问。我很想知道如何处理这个问题。此外,如果有更多关闭,是否有可能运行Out Of Memory?
答案 0 :(得分:3)
当
foo()
完成时,它应该从堆栈中弹出
是的,它已不再有效了。
但由于
bar
的引用在此文件的生命周期内处于活动状态,因此听起来仍然可以访问foo
范围。
确实是。
我很想知道如何处理
包含已关闭的变量的变量环境(“范围”)需要在堆上分配,而不是在堆栈上分配。从调用堆栈弹出的执行上下文(“堆栈帧”)仅包含指向它的指针
因此,在_bar
/ ref2bar
对它的引用被销毁之前,变量环境不会被垃圾收集。
此外,如果有更多关闭,是否有可能会出现内存不足?
是的,每个闭包都是一个对象并占用内存空间。如果创建许多闭包,这些闭包关闭具有较大值的变量,则确实会导致内存泄漏。我不会称之为“公平的机会”,但你需要非常多或非常大的。