1. 主页 > 好文章

JS变量声明方法详解:var、let、const的区别与正确使用


??为什么JS有三种变量声明方式???
JavaScript经历了从ES5到ES6的升级,var是早期声明方式,let和const则是ES6新增的块级作用域声明命令。这三种声明方式的差异直接影响变量作用范围、重复声明规则和代码安全性。


一、var的隐患:变量提升与作用域陷阱

??变量提升现象??:使用var声明的变量会“自动”移动到当前作用域顶部,导致代码执行结果与书写顺序不符。例如:

javascript复制
console.log(a) // 输出undefined而非报错
var a = 10

??函数作用域局限??:var声明的变量只在函数内部形成封闭作用域,在if/for等代码块中会泄露到外部:

javascript复制
for(var i=0; i<5; i++) {}
console.log(i) // 输出5,循环结束后仍可访问

二、let的革新:块级作用域解决方案

??块级作用域??:用花括号{}包裹的代码区域形成独立作用域:

javascript复制
if(true) {
  let name = '小明'
}
console.log(name) // 报错:name未定义

??暂时性死区??:在声明语句之前访问变量会触发错误,强制开发者规范编码习惯:

javascript复制
console.log(b) // 报错
let b = 20

??禁止重复声明??:同一作用域内重复声明let变量会直接报错,避免变量覆盖隐患。


三、const的特殊性:常量声明与使用边界

??必须立即初始化??:

javascript复制
const PI = 3.14  // 正确
const ERROR     // 报错:未初始化

??不可重新赋值??:基础数据类型值不可更改,但引用类型属性可修改:

javascript复制
const user = {name:'张三'}
user.name = '李四'  // 允许操作
user = {}         // 报错:禁止重新赋值

??冻结对象技巧??:使用Object.freeze()实现完全不可变对象:

javascript复制
const arr = Object.freeze([1,2,3])
arr.push(4) // 报错:无法添加新属性

四、对比表格(文字版)

声明方式作用域类型变量提升重复声明重新赋值
var函数作用域存在允许允许
let块级作用域不存在禁止允许
const块级作用域不存在禁止禁止

??什么时候该用哪种声明???

  1. ??优先使用const??:处理固定配置项、数学常量、组件props等不需要重新赋值的场景
  2. ??次选let??:循环计数器、临时变量、需要重新赋值的业务变量
  3. ??避免使用var??:除非维护老旧代码库,新项目建议通过eslint禁用var

当前主流框架(React/Vue)的官方示例已全面采用const/let,这是现代JS开发的共识。在实际工程中,通过配置ESLint的no-var规则强制使用let/const,能让团队代码质量提升至少30%。变量声明看似简单,实则是构建可靠应用的基础设施——选对声明方式,就规避了50%以上的意外变量污染问题。

本文由嘻道妙招独家原创,未经允许,严禁转载