JavaScript 中 var 和 let 的区别

JavaScriptvar let 存在多方面区别,使用场景也有所不同。 ### 区别 - **作用域**:var 具有函数作用域,在函数内部使用 var 声明的变量,在函数外部也可访问,存在变量提升,在声明前访问值为 undefined;let 具有块级作用域,变量只在声明它的代码块内有效,如在 if、for 或其他控制结构中声明的 let 变量在外部不可见[^2][^3][^5]。 ```javascript // var 的函数作用域示例 function testVar() { if (true) { var x = 10; } console.log(x); // 输出 10 } testVar(); // let 的块级作用域示例 function testLet() { if (true) { let y = 20; } // console.log(y); // 报错,y 未定义 } testLet(); ``` - **重复声明**:var 允许在相同作用域中重复声明同一个变量;let 不允许在相同作用域内重复声明同一个变量,否则会引发错误[^2]。 ```javascript // var 重复声明 var a = 10; var a = 20; console.log(a); // 输出 20 // let 重复声明 let b = 10; // let b = 20; // 报错,SyntaxError: Identifier 'b' has already been declared ``` - **提升**:var 变量声明会被提升到作用域的顶部,但初始化不会,访问未初始化的变量会返回 undefined;let 变量也会被提升,但在声明之前使用会导致 ReferenceError,即存在“暂时性死区”[^2]。 ```javascript // var 提升 console.log(c); // 输出 undefined var c = 5; // let 提升 // console.log(d); // 报错,ReferenceError: Cannot access 'd' before initialization let d = 5; ``` - **全局对象**:在全局作用域中,var 声明的变量会成为全局对象(如浏览器环境中的 window)的属性;let 声明的变量不会成为全局对象的属性[^2][^4]。 ```javascript // var 全局对象 var globalVar = "I am global"; console.log(window.globalVar); // 输出 "I am global" // let 全局对象 let globalLet = "I am global too"; console.log(window.globalLet); // 输出 undefined ``` - **闭包中的表现**:var 在闭包中容易因函数作用域导致意外共享同一内存地址;let 在闭包中每次迭代生成独立的块级作用域变量,实现内存隔离[^4]。 ```javascript // var 在闭包中的问题 for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 100); // 输出 3, 3, 3 } // let 在闭包中的正常表现 for (let j = 0; j < 3; j++) { setTimeout(() => console.log(j), 100); // 输出 0, 1, 2 } ``` ### 使用场景 - **var**:由于其作用域提升特性,在现代 JavaScript 开发中一般不推荐使用,除非需要兼容某些旧的代码或环境[^2]。 - **let**:适用于需要块级作用域防止重复声明的场景,能够提升代码可读性可维护性,可避免全局污染闭包问题,推荐在大多数情况下优先使用[^1][^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值