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

let 和 const 不是“升级版 var”,而是为解决 var 的设计缺陷而生的替代方案——用错场景时,它们会直接报错,而不是默默出 bug。
为什么 var 会在 if 里“泄露”变量?
因为 var 只认函数边界,不认 {}。哪怕你在 if、for 或独立代码块里声明,它也会“冒泡”到整个函数顶部。
- 常见错误现象:
console.log(x)在if (true) { var x = 1 };后面居然能输出1,但你本意只想在块内用 - 真实后果:循环中用
var i,回调里取到的全是最后一个值(经典闭包问题) - 怎么做:把
var i = 0换成let i = 0,循环体每次迭代都会创建新绑定,回调就能拿到正确值
为什么 let/const 声明前访问就报错?
这不是 bug,是“暂时性死区(TDZ)”的主动防护。JS 引擎确实提升了 let 和 const 的声明,但不初始化——访问就炸,逼你写顺逻辑。
本文档是python学习笔记与简明教程;为什么用Python作为编程入门语言?每种语言都会有它的支持者和反对者。去Google一下“why python”,你会得到很多结果,诸如应用范围广泛、开源、社区活跃、丰富的库、跨平台等等等等,也可能找到不少对它的批评,格式死板、效率低、国内用的人很少之类。不过这些优缺点的权衡都是程序员们的烦恼。作为一个想要学点编程入门的初学者来说,简单才是最重要的。当学C++的同学还在写链表,学Java的同学还在折腾运行环境的时候,学Pyt
- 对比:
console.log(a); var a = 1→ 输出undefined;console.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;需要重赋值时改用 let;var 仅用于兼容老环境(如 IE11)或极少数需要函数作用域的 legacy 场景。









