JavaScript闭包引发内存泄漏原理

读《JavaScript高级程序设计》有感。

要弄清这个问题,先得了解JavaScript函数执行的工作过程。

文章原文

函数在被调用时,会创建一个函数的执行环境以及相应的作用域链,使用arguments和其他的命名参数来初始化函数的活动对象。但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象始终处于第三位,。。。直到全局执行环境。

原文比较晦涩,结合实例研究比较清晰。

二话不说,直接创建一个函数。

    let a = 1
    function fn(){
        let a = 2
        console.log(a)
    }
    fn()

一眼可以看出输出是2。原理是什么呢。

然后我们根据书上的描述来刨析这个函数。首先是第一句话

函数在被调用时,会创建一个函数的执行环境以及相应的作用域链。

此时的内部应该是这样

第二步,初始化函数fn的执行环境

然后是最后一句话。但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象始终处于第三位,。。。直到全局执行环境。

那么在闭包中的情况就是这样

    let a = 1
    function fn(){
        let a = 2
        return (function () {
            return  a
        })()
    }
    fn()

函数内又包含了一个匿名函数,那么这个匿名函数的执行环境如下。

匿名函数的执行环境
匿名函数的作用域链

匿名函数的作用域链如下

匿名函数的作用域链
2全局
1fn的活动对象
0匿名函数的活动对象

函数fn执行后。匿名函数就可以访问在fn中定义的全部变量。而且fn在执行完成后,其活动对象也不会销毁,因为匿名函数的作用域链还在引用着这个对象。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值