Javascript关闭&堆栈展开

时间:2015-11-03 16:45:15

标签: javascript

我正试图深入理解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?

1 个答案:

答案 0 :(得分:3)

  

foo()完成时,它应该从堆栈中弹出

是的,它已不再有效了。

  

但由于bar的引用在此文件的生命周期内处于活动状态,因此听起来仍然可以访问foo范围。

确实是。

  

我很想知道如何处理

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

  

此外,如果有更多关闭,是否有可能会出现内存不足?

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