javascript - 闭包:是外部函数的整个作用域还是只有被引用的变量才保存在内存中吗?
阿神
阿神 2017-04-10 14:45:29
[JavaScript讨论组]
function foo(){
    var name = "hello",
        age = 18;

    return function(){
        return name;
    }
}

对于上面构建的闭包,众所周知name会保存在内存中。那么age呢?age有没有被回收?以及有什么方法可以证明age是否被回收呢?

谢谢解答!

阿神
阿神

闭关修行中......

全部回复(5)
黄舟

来看看 justjavac 的一篇

高洛峰

age有没有回收和这段程序有什么关系呢?GC实现有选择的自由,开发者可以决定是否以及何时回收age,至于这个程序段,反正age你也没用,它有没有被回收对这段程序没有任何影响。
要记住一点,一个最简单的GC实现可以什么都不干,任由内存随便泄漏,虽然这样做很扯,但再扯也是符合标准的。

PHPz
function foo(){
    var name = "hello",
    var age = 18;

    console.log(age);
    console.log(name);

    return function(){
        console.log(age);
        console.log(name);

        return name;
    }
}




var Foo = foo();
// 18
// 'hello'

console.log(Foo());
// 18
// 'hello'
// 'hello'
ringa_lee

我想是会的,因为age和底下的匿名函数没有任何关系,为什么不回收呢?

但是是不是立即回收,这个只有gc知道了。

巴扎黑

想看下是否立即被回收,具体要看GC的实现,去翻翻GC手册会比较好。

在现代浏览器里,变量是否已经被回收、有没有产生内存泄露,你只有专门对程序做profiling,对内存做快照等等手段才有可能知道。不过在此之前,一个不被闭包使用到的变量是可以先GC一步被解释器优化掉的。

//测试代码
function exp1(){
    var name="name"
    var age=100

    return function(){
        return name;
    }
}

console.dir(exp1())

function exp2(){
    var name="name"
    var age=100

    return function(){
        return [name,age]
    }
}

console.dir(exp2())

如图可见。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号