问答

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

作者:admin 2021-04-09 我要评论

原文地址: https://juejin.cn/post/684490... 有如下代码会造成内存泄露 var t = null;var replaceThing = function() { var o = t var unused = function() { i...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

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

求大佬解释

###

不是存储着变量 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 函数的意思吗?

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器