我觉得作用域和执行上下文是两个不可分开的概念。在ES6之前,JavaScript不同于C/C++这些语言,其作用域只有全局作用域和函数作用域。
执行上下文
变量或函数的上下文决定了他们可以访问哪些数据。下面根据一段代码来解释:
var a=10;
function test1(){
let b=20;
function test2(){
let c=b;
b=a;
a=c;
}
test2()
}
test1();
在执行时依赖一个上下文执行栈,如下图所示:
全局上下文先入栈,test1入栈,遇到test2执行入栈。test2执行完出栈,test1执行完出栈。全局上下文在应用程序退出前才会出栈。
形成了作用域链:
从下往上,优先级逐渐降低,如果在下面找不到对应变量,就往上一级,还是没找到再往上一级,最多到全局上下文。