不懂就问,关于闭包内存泄露问题

发布于 2022-09-12 23:07:11 字数 845 浏览 9 评论 0

原文地址:https://juejin.cn/post/684490...
有如下代码会造成内存泄露

var t = null;
var replaceThing = function() {
  var o = t
  var unused = function() {
    if (o) {
      console.log("hi")
    }        
  }
 
  t = {
        longStr: new Array(100000).fill('*'),
        someMethod: function() {
                       console.log(1)
                    }
      }
}
setInterval(replaceThing, 1000)

其中有一段解释看不懂

因为 replaceThing 函数里,手动将内部创建的字面量对象赋值给全局变量,而且这个对象还有个 someMethod 方法,所以 someMethod 方法就因为闭包特性存储着 replaceThing 的变量

虽然 someMethod 内部并没有使用到什么局部变量,但 replaceThing 内部还有一个 unused 函数啊,这个函数就使用了局部变量 o,因为共享闭包,导致 someMethod 也存储着 o

问题如下
someMethod 为什么会存储着replaceThing的变量 o?

求大佬解释

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

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

发布评论

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

评论(2

一张白纸 2022-09-19 23:07:11

不是存储着变量 o, 而是 someMethod 他在 replaceThing 函数的上下文中,所有在 replaceThing 中的代码都拥有 replaceThing 中的上下文,也就是可以使用其中的变量,就算下次被独立拿出来运行,其上下文依然不变。

如下代码,通过函数 f 返回一个匿名函数,而返回的函数无论如何使用,其依然可以对 f 函数中变量 acc 进行操作,js 的函数上下文主要看的就是创建函数那一刻的上下文,而不是使用时候的上下文,因此本例将依次打印 1,2,3,4。

const f = ()=>{
    let acc = 0;
    return function(){
        acc++;
        console.log(acc);
    }
}

const fi = f();

fi();   // 1
fi();   // 2
fi();   // 3
fi();   // 4
面如桃花 2022-09-19 23:07:11

是不是 someMethod 内部是能够访问到 unused 函数的意思吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文