闭包作用域
闭包作用域详解
- 闭包就是函数执行形成私有上下文,保护里面的变量不受外界影响,也可以理解为函数执行形成不销毁的私有上下文,保护里面的变量不受外界的影响
- 创建函数
- 开辟一个堆内存
- 把函数体中的代码字符串的形式存储到堆内存中
- 把堆内存地址赋值给函数名或者变量名(赋值操作永远是把右边的结果赋值给左边)
- 给当前函数设置作用域[[scope]] = 当前函数创建时所在的上下文
- 函数执行
- 形成一个私有执行上下文
- 进栈(即形成的私有上下文进入ECStack(执行环境栈)执行,把上一个执行上下文放到ECStack底部)
- 初始化作用域链(scopeChain)
- 初始化this指向
- 形参变量赋值
- 变量提升
- 代码指向
- 代码指向完成可能出栈销毁,也可能保留(这是关于垃圾回收机制的稍后在描述)
- 关于内存释放问题
- 定时销毁机制:谷歌浏览器每间隔一段时间就会查看堆内存的空间地址引用情况,没有被引用的就会回收销毁
- 计数销毁机制:火狐IE会查看当前堆内存地址有多少个变量等占用,如果占用数量为0,就会销毁当前堆内存
- 全局执行上下文只有关闭页面才会销毁
- 私有执行上下文,看里面的内容一般是空间地址,是否被私有上下文之外的东西占用,如果有则不销毁,如果没有则销毁
- 闭包有两大作用
- 保护:即保护里面的私有变量不受外界影响
- 保存:即会把私有变量对于的私有信息保存下来