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

原文地址: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?

求大佬解释

阅读 1.8k
2 个回答

不是存储着变量 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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题