JavaScript作用域与作用域链

js中变量的作用域(scope)分为两种,全局变量和局部变量
[[scope]] 指作用域,存储了执行期上下文的集合。执行期上下文又分为两种,Global Object (GO) 和Activation Object(AO)。

在最外层函数定义的,基于window对象的变量拥有全局作用域
就是对任何内部函数来说都是可以进行访问的。GO是全局的执行期上下文。

<script>
      var outerVar = "outer"; //全局变量 基于window对象
      function fn(){
         console.log(outerVar);
      }
      fn();
   </script>

和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的。AO为函数执行产生的独一无二的局部执行期上下文。多次调用函数会产生多个执行期上下文,函数执行完毕执行期上下文被销毁。

<script>
      function fn(){
         var innerVar = "inner"; //局部变量 只能在函数fn()内访问到
      }
      fn();
      console.log(innerVar);
</script>

一段函数预编译中的过程,在声明提前阶段会创建一个执行环境栈,自动生成一个默认函数main()并且创建全局作用域对象window。
在函执行结束后,fun()出栈,所指向的AO对象也会相应被释放。
在这里插入图片描述
作用域则是指变量能够发挥作用的范围,一段函数内的局部变量的作用范围只在这段函数之中,但是如果此函数内需要的变量在该函数内无法访问,即向此函数的上级函数作用域进行访问调用,直至访问到window对象的全局作用域GO。这一层一层的访问过程,便可理解为作用域链。

作用域链
根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问。
在这里插入图片描述
这段执行期上下文AO一层层查找指向GO的过程就可以理解为作用域链。

变量的生命周期
JavaScript 变量生命周期在它声明时初始化。
局部变量在函数执行完毕后销毁。
全局变量在页面关闭后销毁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值