JS闭包变量内存占用问题

cozybz 发布于 2014/09/30 16:53
阅读 2K+
收藏 2

一个最简单的闭包场景:

function a (){
    var foo1 = 1;
    var foo2 = 'foo';
    function b (){
        foo1++;
        return foo1;
    }
    return b;
}
var c = a();
var d = c();  //d=2
var e = c();  //e=3  但这种时候foo2是否会被回收?



foo1由于被函数b引用,是不会被回收的,那么没有被b引用的foo2是否会被回收呢?

又有什么工具/方法来验证呢?

初学JS,谢谢!

加载中
0
甩葱哥
甩葱哥

目前看,你则例写的b只是个在window下定义一个名为b的function对象过程。并没有调用b。

另外js的作用域是词法作用域。变量会在function调用的时候顺着作用域链查找。

如果能运行到return就会被回收,我是这么看的。

cozybz
cozybz
谢谢,修改了一下用例,代码执行到12行时,foo2还存在栈内吗?
0
甩葱哥
甩葱哥
foo2在函数 a 的运行状态中会存在,会在return后消失,你的11 12行都是对b的调用过程,跟foo2没什么关系。
0
甩葱哥
甩葱哥
我记得《javascript权威指南》第五版 说js的回收机制是上下文对某一个标示符无调用就会被回收。我们要做的就是相信它的回收机制。。。
0
甩葱哥
甩葱哥
抱歉我的观点应该是错误的,我仔细用调试器跑了一遍。每当b调用的时候,调试器在b的执行状态中,foo2是可见的。
0
甩葱哥
甩葱哥
目前看来,只要a没有被回收,它内部声明的变量是一直存在的
0
cozybz
cozybz

@甩葱哥 ,用什么调试的啊,我的chrome只能看到foo1

0
甩葱哥
甩葱哥

运行到图片的13行,单步进入到 function b

调试器显示在b中 foo2可见

0
甩葱哥
甩葱哥
你的调试器是不是只显示了闭包没有显示完整的作用域链
0
甩葱哥
甩葱哥
firebug显示a(),foo1 和 foo2 都可见
返回顶部
顶部