三者都是声明变量,区别主要有四点:

  1. 作用域var 是函数作用域,let/const 是块级作用域({} 内有效);
  2. 提升var 声明提升并初始化为 undefinedlet/const 也提升但存在「暂时性死区」,声明前访问会抛 ReferenceError
  3. 重复声明var 允许,let/const 不允许;
  4. 赋值const 声明时必须初始化且不能重新赋值,但对象的属性仍可修改(绑定不可变,值可变)。
console.log(a); // undefined
var a = 1;
console.log(b); // ReferenceError(暂时性死区)
let b = 2;

易错点:const 不等于「常量对象」,想冻结对象要用 Object.freeze。实践建议:优先 const,需要重新赋值再用 let,避免 var。追问:var 挂载到全局对象(window.x)而 let/const 不挂载;for 循环中 let 每次迭代创建新绑定的机制。