JS作用域,作用域链
一、作用域作用域就是变量的有效访问范围出了地盘就找不到这个变量。 JS 有三种全局作用域、函数作用域、块级作用域1. 全局作用域写在函数、大括号外面的变量整个 JS 文件随便用。let a 10; // 全局变量 function fn() { console.log(a); // 可以读到全局a } fn() console.log(a); // 外面也能读到2. 函数作用域var 老语法变量写在函数内部只能函数里面用外面访问不到。function fn() { var b 20; // 函数内变量 console.log(b); } fn(); console.log(b); // ❌报错外面看不见b重点var只认函数大括号普通{ }if/for 大括号关不住 var。if(true){ var c 30 } console.log(c) // 可以打印30var不受if大括号限制3. 块级作用域 ES6let / const只要是{ }if、for、while、普通大括号就形成一块地盘。let const被大括号锁住出大括号就失效。if(true){ let d 40 } console.log(d) // ❌报错出了{}找不到dvar vs let/const 核心区别var函数作用域会变量提升允许重复声明let/const块级作用域有暂时性死区不能重复声明暂时性死区TDZ块内let声明之前不能使用变量这片区域叫死区。console.log(x); // ❌报错死区不能提前用 let x 100;var 不会报错会拿到 undefined作用域链函数找不到自己的变量就一层一层向外层作用域找直到全局找不到报错。let num 100 function outer(){ let num 200 function inner(){ console.log(num) // 先看自己没有 → 找outer找到200 } inner() } outer()查找顺序自己局部 → 父作用域 → 祖父 → 全局。只会往外找不会往里找。