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对象也会相应被释放。
作用域则是指变量能够发挥作用的范围,一段函数内的局部变量的作用范围只在这段函数之中,但是如果此函数内需要的变量在该函数内无法访问,即向此函数的上级函数作用域进行访问调用,直至访问到window对象的全局作用域GO。这一层一层的访问过程,便可理解为作用域链。
作用域链
根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问。
这段执行期上下文AO一层层查找指向GO的过程就可以理解为作用域链。
变量的生命周期
JavaScript 变量生命周期在它声明时初始化。
局部变量在函数执行完毕后销毁。
全局变量在页面关闭后销毁。
下一篇: Java 抽象类