不懂就问,关于闭包内存泄露问题
原文地址: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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不是存储着变量 o, 而是 someMethod 他在 replaceThing 函数的上下文中,所有在 replaceThing 中的代码都拥有 replaceThing 中的上下文,也就是可以使用其中的变量,就算下次被独立拿出来运行,其上下文依然不变。
如下代码,通过函数 f 返回一个匿名函数,而返回的函数无论如何使用,其依然可以对 f 函数中变量 acc 进行操作,js 的函数上下文主要看的就是创建函数那一刻的上下文,而不是使用时候的上下文,因此本例将依次打印 1,2,3,4。
是不是 someMethod 内部是能够访问到 unused 函数的意思吗?