一、作用域
作用域就是变量的有效访问范围,出了地盘就找不到这个变量。 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) // 可以打印30!var不受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()查找顺序:自己局部 → 父作用域 → 祖父 → 全局。只会往外找,不会往里找。