跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

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

let和var的核心区别有三点:作用域上let限于花括号内,var提升至函数或全局;var存在变量提升(声明前置、值为undefined),let有暂时性死区(声明前访问报错);var允许重复声明,let在同一作用域下禁止重复声明。 JavaScript 中
let
和
var
声明变量的区别,核心就三点: 作用域 、变量提升、重复声明 不用记“块级作用域”这种术语,直接看行为:
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
声明执行前,该变量名不可访问。 立即学习 “ Java免费学习笔记(深入) ”; Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载 能否重复声明?
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 —— 它不是语法错误,而是运行时报错,而且只在你“提前访问”时触发,调试时容易绕晕。写代码时养成“先声明再用”的习惯,比记规则更可靠。

相关文章