javascript变量怎么声明_let和var有何区别

let和var的核心区别有三点:作用域上let限于花括号内,var提升至函数或全局;var存在变量提升(声明前置、值为undefined),let有暂时性死区(声明前访问报错);var允许重复声明,let在同一作用域下禁止重复声明。

JavaScript 中 letvar 声明变量的区别,核心就三点:作用域、变量提升、重复声明

不用记“块级作用域”这种术语,直接看行为:let 声明的变量只在它出现的花括号 {} 内有效;var 声明的变量会“跑出” {},跑到整个函数(或全局)里去。

比如:

function test() {
  if (true) {
    var a = 1;
    let b = 2;
  }
  console.log(a); // 1 —— var 跑出来了
  console.log(b); // ReferenceError: b is not defined —— let 没跑出来
}

var 会变量提升,let 不会(但有“暂时性死区”)

var 声明会被“提升”到函数或全局顶部,赋值不提升。所以你能在声明前读取它(值是 undefined);let 不会提升,更严格——在声明语句执行前访问它,直接报错。

  • console.log(x); var x = 10; → 输出 undefined(不报错)
  • console.log(y); let y = 10; → 报 ReferenceError: Cannot access 'y' before initialization

这个报错就是“暂时性死区”(TDZ):从块开始到 let 声明执行前,该变量名不可访问。

能否重复声明?var 允许,let 不允许

同一个作用域下:

  • var a = 1; var a = 2; → 合法,a 最终是 2
  • let b = 1; let b = 2; → 报 SyntaxError: Identifier 'b' has already been declared

注意:不同作用域可以同名,比如函数内 let 和全局 let 不冲突;但同一作用域内重名就是错。

实际开发中怎么选?

现代 JS 开发基本只用 let(和 const),除非你要显式利用 var 的函数作用域或变量提升特性(极少见)。

  • 默认用 const,值会变时改用 let
  • 别用 var,尤其在循环、异步回调、条件块里,var 容易引发意料外的共享变量问题
  • 比如 for (var i = 0; i console.log(i), 0); 会输出三个 3;换成 let i 就输出 0, 1, 2

真正容易被忽略的是 TDZ —— 它不是语法错误,而是运行时报错,而且只在你“提前访问”时触发,调试时容易绕晕。写代码时养成“先声明再用”的习惯,比记规则更可靠。