js 闭包,作用域链,活动对象,变量对象

什么是闭包

简单的来讲,就是一个函数,一个有权访问另外一个函数作用域内的变量的函数,

常见的创建闭包的方式就是在一个函数内部创建另外一个函数

问题又来了,什么是函数作用域

先要介绍一下什么是执行环境(环境),执行环境定义了变量或者函数有权访问的其他数据,决定了它们各自的行为,每一个环境都有一个与之关联的变量对象,环境中定义的所有的变量和函数都保存在这个对象里,私以为,这个变量对象就是作用域

那什么是变量对象

当某个函数被调用时,会创建一个执行环境及相应的作用域链,然后使用arguments和其他命名参数的值来初始化函数的活动对象,因为这个环境是个函数,我们就把这个活动对象作为变量对象

什么是作用域链

多个作用域连在一起,就是作用域链嘛,哈哈哈,js在创建一个函数时会创建一个包含全局变量对象和本地活动对象(当前函数活动对象)作用域链,当我们访问一个对象属性时,就会在作用域链上寻找,由内向外,直到查找到这个对象或者全局作用域为止

作用域本质上是一个指向变量对象的指针列表,只引用不实际包含变量对象

所以

在内部函数的作用域链上有当前环境的变量对象和外部函数的活动对象,外部函数的作用域链又有外部函数的外部函数的活动对象,直至作用域的终点全局执行环境

就是因为在内部函数的作用域链上能找到外部函数的活动对象,所以可以访问到外部函数作用域内的变量

注: 一般当函数执行完毕后,局部活动对象就会被销毁,内存中仅保留全局作用域,但是闭包有点不同,当内部函数被return后,外部函数的作用域链会被销毁,但是活动对象仍然保存在内存中,因为在内部函数的作用域链仍然引用这个活动对象,除非内部函数也被销毁

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值