首页 > js 变量回收的疑问

js 变量回收的疑问

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

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; 它为什么没被回收?


注释一下应该好明白一些

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里面保留的,全局没被回收是因为不知道什么时候还会用到它,所以不能回收。


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

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


推荐看看这篇文章:

JavaScript 内存优化

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


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


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

【热门文章】
【热门文章】