欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript作用域与作用域链

程序员文章站 2024-02-17 16:35:40
...

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对象也会相应被释放。
JavaScript作用域与作用域链
作用域则是指变量能够发挥作用的范围,一段函数内的局部变量的作用范围只在这段函数之中,但是如果此函数内需要的变量在该函数内无法访问,即向此函数的上级函数作用域进行访问调用,直至访问到window对象的全局作用域GO。这一层一层的访问过程,便可理解为作用域链。

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

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