let与var的核心区别在于作用域(块级vs函数级)、变量访问时机(TDZ vs提升为undefined)、循环绑定(每次迭代新建绑定vs共享变量)、重复声明及全局污染控制。

let 和 var 的核心区别不在“能不能用”,而在于“变量该在哪儿生效、什么时候能访问”。现代 JavaScript 开发中,var 基本只用于兼容旧代码或极少数特殊场景,日常应默认用 let(配合 const)。
作用域范围不同:块级 vs 函数级
var 声明的变量属于函数作用域(或全局),哪怕写在 if、for 里,也能在块外访问;let 严格限制在最近的一对 {} 内,出了这个块就不可见。
-
var 示例:
if (true) { var x = 1; } console.log(x); // 输出 1 —— 变量“逃出”了 if 块 -
let 示例:
if (true) { let y = 2; } console.log(y); // 报错 —— y 只在 if 块内有效
变量可访问时机不同:提升方式与暂时性死区
两者声明都会被提升,但处理方式完全不同:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
var 提升后初始化为 undefined:
console.log(a); var a = 5;不报错,输出undefined -
let 在声明前访问会直接报错:
console.log(b); let b = 5;抛出ReferenceError,这段区域叫“暂时性死区(TDZ)”
循环中的行为差异最能体现本质
这是最容易踩坑也最能说明问题的典型场景:
立即学习“Java免费学习笔记(深入)”;
-
var 循环共享一个变量:
for (var i = 0; i console.log(i), 0); }输出三个3 -
let 每次迭代创建新绑定:
for (let j = 0; j console.log(j), 0); }正确输出0, 1, 2
重复声明和全局污染风险
var 允许同一作用域多次声明,容易覆盖或误用;let 不允许重复声明,且不会挂到全局对象(如 window)上。
-
var 可重复:
var a = 1; var a = 2;合法,a 最终是 2 -
let 禁止重复:
let b = 1; let b = 2;直接语法错误 -
var 全局泄露:
var c = 3;在全局作用域下,window.c存在;let d = 4;则不会

















