简单点理解:
<script>
var b = 2;
function fn() {
var a = 1;
console.log(b);
}
fn(); // 2
console.log(a); // a is not defined 不能访问函数作用域中的变量a
</script>
全面理解:
比如特殊的全局执行环境中的变量对象 window 对象,因此所有全局变量和函数都作为 window 对象的属性和方法创建的。在 Node 环境中,全局执行环境是 global 对象
<script>
var a = 1;
function sum(a, b) {
return a + b;
}
var n = window.sum(2, 3); // sum 相当于window对象上的方法
console.log(window.n); // 5 n相当于window对象的属性
console.log(window.a); // 1 a相当于window对象的属性
</script>
解析
- 每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。
- 而在函数执行之后,栈将被环境弹出,把控制权返回给之前的执行环境。
- ECMAScript 程序中的执行流正是由这个方便的机制控制着。
JS 中有 3 种类型的作用域: