什么是作用域
作用域决定了数据的访问范围,也就是确定当前执行代码对变量和表达式的访问权限。
作用域的分类
作用域分为词法作用域和动态作用域;
什么是词法作用域
词法作用域,即静态作用域,函数的作用域在函数定义的时候就决定了。
什么是动态作用域
动态作用域,函数的作用域在函数调用的时候才决定。
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])。无论函数在哪里被调用,其作用域链都不会随之改变。