闭包作用域

263 阅读2分钟

闭包作用域详解

  • 闭包就是函数执行形成私有上下文,保护里面的变量不受外界影响,也可以理解为函数执行形成不销毁的私有上下文,保护里面的变量不受外界的影响

  • 创建函数
    1. 开辟一个堆内存
    2. 把函数体中的代码字符串的形式存储到堆内存中
    3. 把堆内存地址赋值给函数名或者变量名(赋值操作永远是把右边的结果赋值给左边)
    4. 给当前函数设置作用域[[scope]] = 当前函数创建时所在的上下文
  • 函数执行
    1. 形成一个私有执行上下文
    2. 进栈(即形成的私有上下文进入ECStack(执行环境栈)执行,把上一个执行上下文放到ECStack底部)
    3. 初始化作用域链(scopeChain)
    4. 初始化this指向
    5. 形参变量赋值
    6. 变量提升
    7. 代码指向
    8. 代码指向完成可能出栈销毁,也可能保留(这是关于垃圾回收机制的稍后在描述)

  • 关于内存释放问题
    • 堆内存的释放有两种机制
    1. 定时销毁机制:谷歌浏览器每间隔一段时间就会查看堆内存的空间地址引用情况,没有被引用的就会回收销毁
    2. 计数销毁机制:火狐IE会查看当前堆内存地址有多少个变量等占用,如果占用数量为0,就会销毁当前堆内存
    • 执行上下文的释放
    1. 全局执行上下文只有关闭页面才会销毁
    2. 私有执行上下文,看里面的内容一般是空间地址,是否被私有上下文之外的东西占用,如果有则不销毁,如果没有则销毁

  • 闭包有两大作用
    1. 保护:即保护里面的私有变量不受外界影响
    2. 保存:即会把私有变量对于的私有信息保存下来