2019-03-25 js闭包和内存释放

作者: zlx_2017 | 来源:发表于2019-03-25 17:08 被阅读0次

    闭包的那些事儿

    • 怎么写一个闭包
      闭包是什么就不解释了,直接写一个闭包函数:
      var f = function() {
        var num = 0;
        return function() {
          return num += 1;
        };
      }
    

    js中,函数是一等公民,定义一个函数f,它返回另一个可执行函数function() { return num += 1; };

    js中的作用域,都是一层一层向上找的,在f内部函数里面,他的num向上找到父函数的作用域。
    现在,我们执行一下:

    f()()
    // 1
    f()()
    // 1
    ????? 感觉 不太对?为什么num没有自增呢??
    
    • 内存回收机制
      为什么上面执行结果不太对,因为执行f()()后,f函数已经执行完毕了,没有其他资源引用f,ta会被立即释放,也就是说,f()()执行完后,立即就释放了。
      如何才不释放呢?
    // 创建f的引用
    var fn = f();
    fn()
    // 1
    fn()
    // 2
    fn()
    // 3
    

    这下就对了,num成了私有变量,f拥有了私有作用域。

    完了吗?
    f有了fn的引用,内存一直得不到释放,咋办呢?这样的函数多了是不是会造成内存溢出?
    手动释放一下:

    var fn = f();
    fn()
    // 1
    fn()
    // 2
    fn()
    // 3
    // 手动释放f的引用
    fn = null
    // f的引用fn被释放了,现在f的作用域也被释放了。num再次归零了。
    var fn = f()
    fn()
    // 1
    

    相关文章

      网友评论

        本文标题:2019-03-25 js闭包和内存释放

        本文链接:https://www.haomeiwen.com/subject/tisbvqtx.html