如何在 JavaScript 中使用 var、let、const 声明变量?
一、核心声明语法(基础用法)
1. var 声明(ES5 语法,不推荐)
语法:var 变量名 = 赋值;(赋值可选,未赋值则为undefined)
- 支持无赋值声明、重复声明、重新赋值;
- 作用域为「函数 / 全局作用域」,无块级作用域。
javascript
运行
// 1. 仅声明,未赋值 var a; console.log(a); // undefined // 2. 声明并赋值 var b = 10; console.log(b); // 10 // 3. 重复声明(允许) var b = 20; console.log(b); // 20 // 4. 重新赋值 b = 30; console.log(b); // 30 // 5. 无块级作用域(if/for 块内声明会泄露到外部) if (true) { var c = 5; } console.log(c); // 52. let 声明(ES6 推荐,可变变量)
语法:let 变量名 = 赋值;(赋值可选,未赋值则为undefined)
- 不支持重复声明,支持重新赋值;
- 作用域为「块级作用域」(
{}内),存在暂时性死区。
javascript
运行
// 1. 仅声明,未赋值 let d; console.log(d); // undefined // 2. 声明并赋值 let e = 20; console.log(e); // 20 // 3. 重新赋值(允许) e = 40; console.log(e); // 40 // 4. 重复声明(报错) // let e = 50; // Uncaught SyntaxError: Identifier 'e' has already been declared // 5. 块级作用域(外部无法访问) if (true) { let f = 8; } // console.log(f); // Uncaught ReferenceError: f is not defined // 6. 暂时性死区(声明前访问报错) // console.log(g); // Uncaught ReferenceError: Cannot access 'g' before initialization let g = 100;3. const 声明(ES6 推荐,常量 / 不可变引用)
语法:const 变量名 = 赋值;(赋值必须,不可省略)
- 不支持重复声明、重新赋值;
- 作用域为「块级作用域」,存在暂时性死区;
- 注意:引用类型(对象 / 数组)仅禁止修改地址,内部属性 / 元素可改。
javascript
运行
// 1. 声明并赋值(必须赋值,否则报错) const h = 30; console.log(h); // 30 // 2. 重新赋值(报错) // h = 60; // Uncaught TypeError: Assignment to constant variable. // 3. 重复声明(报错) // const h = 90; // Uncaught SyntaxError: Identifier 'h' has already been declared // 4. 块级作用域 if (true) { const i = 15; } // console.log(i); // Uncaught ReferenceError: i is not defined // 5. 引用类型(对象/数组):地址不可改,内部可改 const obj = { name: "张三" }; obj.name = "李四"; // 允许修改属性 console.log(obj); // { name: '李四' } const arr = [1, 2, 3]; arr.push(4); // 允许修改元素 console.log(arr); // [1, 2, 3, 4] // arr = [5,6]; // 报错(修改地址)二、关键使用规则(避坑重点)
- 赋值规则:
- var/let 可 “先声明后赋值”,const 必须 “声明即赋值”;
- 仅 const 禁止重新赋值,var/let 无此限制。
- 作用域规则:
- var 无块级作用域,let/const 受
{}限制(if/for/ 函数块均生效); - 全局作用域中,var 声明会挂载到
window,let/const 不会。
- var 无块级作用域,let/const 受
- 重复声明:
- 同一作用域内,var 允许重复声明,let/const 禁止。
三、实战推荐写法
javascript
运行
// 1. 常量/无需修改的变量 → 用 const const PI = 3.14159; const userList = ["张三", "李四"]; // 数组地址不变,内部可改 // 2. 需要修改的变量 → 用 let let count = 0; count += 1; // 重新赋值 // 3. 循环变量 → 用 let(避免var的作用域泄露) for (let j = 0; j < 3; j++) { console.log(j); // 0,1,2 } // console.log(j); // 报错,j 仅在循环块内有效 // 4. 禁止使用 var → 避免作用域混乱总结
- var:
var 变量名 = 值,函数 / 全局作用域,允许重复声明 / 重新赋值(不推荐使用); - let:
let 变量名 = 值,块级作用域,禁止重复声明、允许重新赋值(推荐用于可变变量); - const:
const 变量名 = 值,块级作用域,禁止重复声明 / 重新赋值(推荐用于常量 / 引用类型)。
