javascript - js 变量回收的疑问
ringa_lee
ringa_lee 2017-04-10 14:44:21
[JavaScript讨论组]

闭包的一大功能就是保持变量在内存中不被回收。有这样的例子:

var a = function(){
    var i = 0;
    return function(){
        ++i;
    } 
}()
a();//1
a();//2

var b = function(){
    var i = 0;
    return ++i;
}
b();//1
b();//1

对于第一个, i 由于被闭包引用所以没被回收,这是可以理解的。但是,对于第二个例子,我们不用闭包的时候之所以i每次都为0是因为每次都运行了var i= 0,这跟回收没关系吧?那怎么理解“函数运行完后变量就被回收”这句话呢?我们定义一个全局变量:var grobal = 10; 它为什么没被回收?

ringa_lee
ringa_lee

ringa_lee

全部回复(5)
怪我咯

全局变量声明之后,其生命周期会一直存在,直到全局被销毁(浏览器退出、系统关闭等)。函数声明之后,在每一次的运行时,系统会开辟一个新的内存区去运行函数,当函数执行完毕之后该区域会被回收,此为“函数运行完后变量就被回收”,实际上是运行函数的内存区被回收。

PHP中文网

推荐看看这篇文章:

JavaScript 内存优化

这篇文章解答了LZ的疑问。

怪我咯

函数中的变量称为局部变量,“函数运行完后变量就被回收”这句话是对的,在函数外定义一个变量相对于这个函数能是局部变量吗?

黄舟

闭包是因为定义了一个外部引用,所以垃圾回收无法回收资源,非闭包没有引用自然是运行完了回收的

var a = function(){
    var i = 0;
    return function(){
        return ++i;
    } 
}
var b = a()
b()
1
b()
2
var c = a()
c()
1
c()
2

可以看到b中的i和c中的i并不是一个引用 所以LZ你的b函数运行的时候 两个局部i之间根本就没有关系 更没有var i 覆盖了的一说

个人见解 有错希望告诉我 3Q

巴扎黑

注释一下应该好明白一些

var a = function(){
    var i = 0;
    return function(){
        ++i;
    } 
    // 这里i没有被回收,因为在闭包里面还需要用它
}()    // 注意这里有一个()。 执行函数i=0, 并且返回一个函数(该函数包含++i)
a();    // 执行函数(++i),返回1
a();    // 执行函数(++i),返回2

var b = function(){
    var i = 0;
    return ++i;
    // 函数执行完之后i就可能被回收了
}
b();    //执行函数i=0, ++i, 返回1
b();    //执行函数i=0, ++i, 返回1

全局的变量一直在VM里面保留的,全局没被回收是因为不知道什么时候还会用到它,所以不能回收。

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

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