每个作用域都有一个指向父作用域的链接。当使用变量时,JavaScript 会向下查看作用域链,直到它找到所请求的变量或者到达全局作用域(即作用域链的末尾)。
看下面这个例子:
let x0 = 0;
(function autorun1(){
let x1 = 1;
(function autorun2(){
let x2 = 2;
(function autorun3(){
let x3 = 3;
console.log(x0 + " " + x1 + " " + x2 + " " + x3);//0 1 2 3
})();
})();
})();
内部函数 autorun3() 可以访问本地 x3 变量。还可以从外部函数访问变量 x1 和 x2 和全局变量 x0 。
如果找不到变量,它将在严格模式下返回错误。
"use strict"; x = 1; console.log(x) //Uncaught ReferenceError: x is not defined
非严格模式也被称为“草率模式”,它会草率的创建一个全局变量。
x = 1; console.log(x); //1
总结
在全局作用域中定义的变量可在程序的任何位置使用。
在模块中,在函数外部声明的变量都是隐藏的,除非被显式导出,否则不可用于其他模块。
函数作用域意味着函数中定义的参数和变量在函数的任意位置都可见
用 let 和 const 声明的变量具有块作用域。 var 没有块作用域。