如何理解闭包和垃圾回收机制?

发布于 2022-09-07 08:54:01 字数 544 浏览 20 评论 0

最近有读到关于垃圾回收机制和闭包的文章,但是对于他们的理解还是不深刻,存在一些疑惑,希望有大佬可以给予解答

我的理解是局部变量在函数执行完成之后就被回收,而全局变量不会被回收直到窗口关闭(是因为全局变量的生命周期?)

那么函数声明会被回收吗?回收只回收变量?下面的例子:

function a(){
    var i = 1;
    function b(){
        return i
    }
    return b
}
var x = a();
x()

在执行x()后,函数a以及内部的变量i和函数b会被回收?

闭包的另一个作用是常驻内存,例:

for(var i = 0; i< 9; i++){
    (function(i){
        setTimeout(function(){
            console.log(i)
        },1000)
    })(i)
}

这个例子是将变量i保存在匿名函数中,那么函数执行完之后i会被回收吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我的影子我的梦 2022-09-14 08:54:01

内存管理-标记-清除算法部分

  • 函数声明:函数声明和变量是一样的,全局仍可获取则不会被回收,function fun () {}; fun = {};则原本属于函数部分的内存被回收。
  • 函数返回值的引用:x= a()后 x即为内部的函数 b,函数 b内部引用 i,则 b、i都不会被回收, 执行 x() 后,x 仍全局保持对 b 的引用,b、i 不会被回收。
  • 同理,执行结束后 i,仍可全局的 i 仍可获取,所以全局的 i 并不会被销毁。

    • 按我的理解,这里存在两个 i。
    • 闭包存在于 setTimeout 的匿名回调中的 i 对外层立即执行匿名函数(IIFE)的 i 的引用,这一层的 i 在执行结束后会被销毁,这是 IIFE 的实参 i;
    • 另一层 IIFE 对全局的 i,并不是直接引用,也不是闭包,只是简单的参数传递,跟全局 i 的关系只是值当时相等的两个变量,将当时外层 i 的值保留了下来。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文