js作用域与作用域链

155 阅读1分钟

什么是作用域

作用域决定了数据的访问范围,也就是确定当前执行代码对变量和表达式的访问权限。

作用域的分类

作用域分为词法作用域动态作用域

什么是词法作用域

词法作用域,即静态作用域,函数的作用域在函数定义的时候就决定了。

什么是动态作用域

动态作用域,函数的作用域在函数调用的时候才决定。

js中的词法作用域以及举例

js中的作用域是词法作用域,也就是说,函数的作用域在定义的时候就确定了。举个例子来验证:

const foo = "a"
function print(){
    console.log(foo)
}

function main(){
const foo = "b"
print()
}

main()// a

如果是 动态作用域,那么此时输出的foo的值会为b;通过该例子,我们知道js中的作用域是词法作用域。

js中词法作用域的原因

为什么js中的作用域是词法作用域呢?

因为在创建函数执行上下文,初始化词法环境组件的时候,此时作用域就被已经确定。关于执行上下文的概念可以看我之前的文章。当前函数作用域(EnvironmentRecord)和一个外部作用域链的引用(outer)构成了整条作用域链。(数据结构:[EnvironmentRecord, ...outer])。无论函数在哪里被调用,其作用域链都不会随之改变。