ES6从入门到精通:变量

变量声明方式

ES6引入了letconst两种新的变量声明方式,与传统的var形成对比。

let允许声明块级作用域变量,变量仅在当前代码块内有效。const用于声明常量,一旦赋值不可更改,同样具有块级作用域特性。var则存在变量提升和函数级作用域的问题。

块级作用域

使用letconst声明的变量具有块级作用域特性,即变量仅在声明所在的代码块(如ifforwhile等语句的块)内有效。这种特性避免了变量污染全局空间和意外覆盖的问题。

javascript 复制代码
{
  let blockScoped = 'visible inside block';
  const PI = 3.14;
}
console.log(blockScoped); // ReferenceError
console.log(PI); // ReferenceError

暂时性死区

使用letconst声明的变量存在暂时性死区(TDZ)。在变量声明前访问会导致ReferenceError,这与var的变量提升行为不同。这种设计强制了先声明后使用的编程规范。

javascript 复制代码
console.log(a); // ReferenceError
let a = 10;

常量声明

const用于声明常量,必须立即初始化且不能重新赋值。对于对象类型,虽然变量绑定不可变,但对象属性可以修改。这种特性适合声明配置值或不应被重新赋值的引用。

javascript 复制代码
const APP_VERSION = '1.0.0';
APP_VERSION = '2.0'; // TypeError

const user = {name: 'Alice'};
user.name = 'Bob'; // 允许

全局变量声明

在全局作用域中,letconst声明不会成为window对象的属性,这与var不同。这种特性避免了无意中污染全局命名空间的问题。

javascript 复制代码
var globalVar = 'value';
let globalLet = 'value';
console.log(window.globalVar); // 'value'
console.log(window.globalLet); // undefined

循环中的变量

let在循环中表现特殊,每次迭代都会创建新的绑定。这解决了var在循环中共享同一变量的问题,特别适合异步回调场景。

javascript 复制代码
//使用 var
var i = 999
for(var i = 0; i < 3; i++) {
  () => console.log(i);
// 输出0, 1, 2
}
console.log(i)
// 输出3

//使用 let
let i = 999
for(let i = 0; i < 3; i++) {
 () => console.log(i);
// 输出0, 1, 2
}
console.log(i)
// 输出999

重复声明限制

在同一作用域内,letconst不允许重复声明同名变量,而var允许。这种限制有助于避免无意中的变量覆盖。

javascript 复制代码
let x = 1;
let x = 2; // SyntaxError

最佳实践建议

推荐优先使用const,只有当变量需要重新赋值时才使用let。完全避免使用var,除非有特殊兼容性需求。这种实践能带来更可预测的代码行为和更好的可维护性。

对于不应改变的原始值使用const(在栈中的内容),对于需要修改的引用或原始值使用let。对象和数组虽然用const声明,但其内容仍可修改(实际修改的是堆的内容),真正不可变的数据结构需要使用Object.freeze()或其他库。

相关推荐
WMYeah5 分钟前
【无标题】
前端·rust·抽奖程序·跨平台抽奖程序
Unbelievabletobe6 分钟前
免费外汇api的响应时间在不同时段下的波动分析
大数据·开发语言·前端·python
大哥,带带弟弟15 分钟前
Grafana 前端嵌入与 JWT 鉴权实战
前端·grafana
小小小小宇16 分钟前
前端 V8 引擎垃圾回收机制与内存问题排查
前端
前端老石人27 分钟前
CSS 值定义语法
前端·css
sheeta199837 分钟前
Vue 前端基础笔记
前端·vue.js·笔记
小小小小宇37 分钟前
GitLab + GitLab Runner + Qiankun 微前端 + Nginx + Node 中间件 前端开发机从零搭建 CI/CD 全流程
前端
前端那点事42 分钟前
别再写垃圾组件!Vue3 如何设计「真正可复用」的高质量通用组件
前端·vue.js
卷帘依旧1 小时前
JavaScript 中的 Symbol
前端·javascript
老王以为1 小时前
Claude Code 从 GUI 到 TUI:开发者界面的范式回归
前端·人工智能·全栈