Let和Const是什么_与Var有何区别【教程】

18次阅读

let 和 const 是为修复 var 的函数作用域缺陷及变量提升隐患而设计的替代方案:var 在块级中会变量提升并泄露到函数作用域,而 let/const 具有块级作用域、存在暂时性死区(TDZ),且 const 要求必须初始化并保证绑定不可变。

Let 和 Const 是什么_与 Var 有何区别【教程】

let 和 const 不是“升级版 var”,而是为解决 var 的设计缺陷而生的替代方案——用错场景时,它们会直接报错,而不是默默出 bug。

为什么 var 会在 if 里“泄露”变量?

因为 var 只认函数边界,不认 {}。哪怕你在 iffor 或独立代码块里声明,它也会“冒泡”到整个函数顶部。

  • 常见错误现象:console.log(x)if (true) {var x = 1}; 后面居然能输出 1,但你本意只想在块内用
  • 真实后果:循环中用 var i,回调里取到的全是最后一个值(经典闭包问题)
  • 怎么做:把 var i = 0 换成 let i = 0,循环体每次迭代都会创建新绑定,回调就能拿到正确值

为什么 let/const 声明前访问就报错?

这不是 bug,是“暂时性死区(TDZ)”的主动防护。JS 引擎确实提升了 letconst 的声明,但不初始化——访问就炸,逼你写顺逻辑。

  • 对比:console.log(a); var a = 1 → 输出 undefinedconsole.log(b); let b = 1 → 报错 ReferenceError: Cannot access 'b' before initialization
  • 容易踩的坑:在模块顶层或函数开头写 console.log(config),但 const config = {……} 在下面,就会崩
  • 怎么做:把声明尽量提前;或者用 typeof config !== 'undefined' 这类防御写法(仅限必要场景)

const 真的“不可变”吗?

const 保证的是“绑定不可变”,不是“值不可变”。对象、数组声明后,属性和元素仍可修改。

  • 合法操作:const obj = {}; obj.name = 'Alice'; ✅;const arr = []; arr.push(1);
  • 非法操作:obj = {}; ❌;arr = []; ❌;const PI = 3.14; PI = 3.14159;
  • 使用场景:API 地址、配置常量、DOM 元素引用(const btn = document.getElementById('submit'))都该用 const,除非你明确需要后续重新赋值

该选哪个?一条硬规则就够了

默认用 const;需要重赋值时改用 letvar 仅用于兼容老环境(如 IE11)或极少数需要函数 作用域 的 legacy 场景。

  • 性能影响:无。三者运行时开销几乎一致,差异全在语义和错误提示上
  • 兼容性注意:所有现代 浏览器 和 Node.js ≥ 6 都支持 let/const;若需打包兼容低版本,Babel 会自动转译,但 TDZ 行为无法完全模拟
  • 最容易被忽略的一点:const 声明必须带初始值,const x; 直接语法错误——这恰恰是它防错能力的起点
text=ZqhQzanResources