JavaScript中var、let和const的用法及区别详解

作者:纸飞机

时间:2026-10-31

浏览:100

本文详细解析JavaScript中var、let和const三种变量声明方式。重点对比它们的作用域(函数级与块级)、声明提升机制及暂时性死区特性。通过代码示例说明const对对象引用的不可变性限制,并提供现代开发中的最佳实践建议,帮助开发者编写更规范的代码。

文章目录

JavaScript 编程中,变量声明是基础且关键的操作。语言提供了 var、let 和 const 三种声明方式。理解其差异及正确用法对新手开发者至关重要。本文详述这三种方式的细节及区别。

一、var 声明

(一)定义与基本用法

var 是 JavaScript 早期用于声明变量的关键字。用法简单,只需在变量名前添加 var 关键字。例如:

var age;
age = 25;
// 或者可以在声明时直接赋值
var name = "John";

(二)作用域

var 声明的变量具备函数作用域或全局作用域。在函数内部用 var 声明的变量,仅在该函数内可访问,函数外不可访问。例如:

function exampleFunction() {
var localVar = "I'm a local variable";
console.log(localVar); // 输出: I'm a local variable
}
console.log(localVar); // 这里会报错,因为 localVar 在函数外部不可访问

若在全局作用域(非函数内部)使用 var 声明变量,该变量将成为全局对象的属性(浏览器中为 window,Node.js 中为 global)。例如:

var globalVar = "I'm a global variable";
console.log(window.globalVar); // 输出: I'm a global variable

(三)声明提升

var 声明具有声明提升特性。无论声明位置如何,其声明会被提升至作用域顶部,但赋值操作不提升。例如:

console.log(num); // 输出: undefined
var num = 10;
//上述代码等价于:
var num;
console.log(num); // 输出: undefined
num = 10;

声明提升可能导致意外结果,尤其在复杂代码结构中。例如:

function hoistingExample() {
console.log(x); // 输出: undefined
if (false) {
var x = 10;
}
console.log(x); // 输出: undefined
}
hoistingExample();

此例中,尽管 if 块代码不执行,但 var 的声明提升使 x 的声明移至函数顶部,故第一次 console.log(x) 输出 undefined。第二次输出 undefined 是因为 if 块内的赋值未执行。

(四)重复声明

var 允许对同一变量多次声明,后续声明被忽略(若有赋值则覆盖前值)。例如:

var message = "Hello";
var message;
console.log(message); // 输出: Hello
var count = 5;
var count = 10;
console.log(count); // 输出: 10

二、let 声明

(一)定义与基本用法

let 是 ES6 引入的变量声明关键字。基本用法与 var 类似,在变量名前加 let 即可声明。例如:

let age;
age = 30;
// 或者声明时直接赋值
let name = "Jane";

(二)作用域

let 声明的变量具备块级作用域。块级作用域由花括号 {} 定义,涵盖 if、for、while 等语句块。在块内用 let 声明的变量,仅在该块内有效。例如:

if (true) {
let localVar = "I'm a block - level local variable";
console.log(localVar); // 输出: I'm a block - level local variable
}
console.log(localVar); // 这里会报错,因为 localVar 在块外部不可访问

相较于 var 的函数作用域,块级作用域更精细,能更好地控制变量生命周期与范围,降低污染全局作用域的风险。

(三)不存在声明提升与暂时性死区

let 声明无 var 那样的声明提升。在 let 声明前访问变量会引发 ReferenceError,这被称为“暂时性死区”(TDZ)。在代码执行到 let 声明前,变量虽存在于作用域中,但处于“不可用”状态。仅当执行流到达声明语句时,变量才被初始化并可正常使用。例如:

console.log(age); // 报错: ReferenceError: age is not defined
let age = 28;

在 let age = 28; 之前,age 处于暂时性死区,任何访问均触发错误。暂时性死区是 JavaScript 引擎解析代码时的机制。遇到 let 声明时,引擎在作用域中创建变量绑定,但变量处于未初始化状态。仅执行到声明语句本身时,变量才被初始化并可正常使用。此特性使开发者在编写代码时,对变量的声明和使用顺序更加清晰,避免了因变量提升导致的难以调试的问题。

(四)不能重复声明

在同一作用域内,使用 let 重复声明同一变量会引发 SyntaxError 错误。例如:

let count = 5;
let count = 10; // 报错: SyntaxError: Identifier 'count' has already been declared

此限制有助于避免变量声明冲突,使代码更清晰和可维护。

三、const 声明

(一)定义与基本用法

const 同样是 ES6 引入的关键字,用于声明常量。常量一旦声明,其值不可再修改。声明方式与 var 和 let 类似,在常量名前加 const,且必须在声明时进行初始化赋值。例如:

const PI = 3.14159;
const MAX_COUNT = 100;

(二)作用域

const 声明的常量具备块级作用域,与 let 相同。在块级作用域内声明的常量,仅在该块级作用域内有效。例如:

if (true) {
const localVar = "I'm a constant in a block";
console.log(localVar); // 输出: I'm a constant in a block
}
console.log(localVar); // 这里会报错,因为 localVar 在块外部不可访问

(三)值的不可变性

const 声明的常量值不可重新赋值。尝试对常量重新赋值会引发 TypeError 错误。例如:

const PI = 3.14159;
PI = 3.14; // 报错: TypeError: Assignment to constant variable.

需注意,对于对象和数组类型的常量,虽不可重新赋值整个对象或数组,但可修改其内部属性或元素。例如:

const person = {
name: "Alice",
age: 32
};
person.name = "Bob"; // 合法,对象属性可以修改
console.log(person.name); // 输出: Bob
const numbers = [1, 2, 3];
numbers.push(4); // 合法,数组元素可以修改
console.log(numbers); // 输出: [1, 2, 3, 4]

若希望确保对象或数组的内容也不可变,可使用 Object.freeze() 方法。例如:

const frozenPerson = Object.freeze({
name: "Charlie",
age: 25
});
frozenPerson.name = "David"; // 虽然不会报错,但实际上属性值并未改变
console.log(frozenPerson.name); // 输出: Charlie

(四)不存在声明提升与暂时性死区

与 let 一样,const 声明也不存在声明提升。在使用 const 声明常量前访问该常量会引发 ReferenceError 错误,同样存在暂时性死区。在常量声明语句前,该常量虽在作用域中有绑定,但处于未初始化状态,无法被访问和使用。例如:

console.log(MAX_COUNT); // 报错: ReferenceError: MAX_COUNT is not defined
const MAX_COUNT = 200;

当代码执行到 const MAX_COUNT = 200; 时,常量 MAX_COUNT 才被初始化并可正常使用。这与 let 声明的暂时性死区原理一致,旨在使代码在变量(常量)的声明和使用上更加规范和可预测。

四、var、let 和 const 的区别

(一)作用域

  • var:具备函数作用域或全局作用域。在函数内部声明的 var 变量在整个函数内有效,在全局作用域声明的 var 变量成为全局对象的属性。
  • let:具备块级作用域。在块级作用域(如 if 块、for 循环块等)内声明的 let 变量仅在该块内有效,能更好地控制变量的作用范围,减少变量污染。
  • const:同样具备块级作用域,与 let 类似,在声明它的块级作用域内有效。

(二)声明提升

  • var:存在声明提升,变量声明会被提升至作用域顶部,但赋值操作不会提升。这可能导致在变量声明前访问它时得到 undefined 值,从而引发一些不易察觉的错误。
  • let:不存在声明提升,在声明变量前访问会引发 ReferenceError 错误,存在暂时性死区,使得代码在变量声明前无法访问该变量,提高了代码的可预测性。
  • const:也不存在声明提升,同样存在暂时性死区,在声明常量前访问会引发 ReferenceError 错误。

(三)可变性

  • var:声明的变量可被重新赋值,也可在同一作用域内被重复声明(后面的声明会被忽略,有赋值时会覆盖之前的值)。
  • let:声明的变量可被重新赋值,但在同一作用域内不能重复声明,避免了变量声明冲突。
  • const:声明的常量不可被重新赋值(对于对象和数组类型,虽不可重新赋值整个对象或数组,但内部属性和元素可修改,若要完全禁止修改,可使用 Object.freeze() 方法),并且在声明时必须初始化赋值。

(四)使用场景建议

  • var:由于其存在声明提升和函数作用域的特性,可能导致一些代码理解和维护上的困难。在现代 JavaScript 开发中,var 的使用场景逐渐减少,一般仅在需要兼容非常旧的 JavaScript 环境(不支持 ES6 及以上特性)时才考虑使用。
  • let:适用于需要在块级作用域内声明变量,并且变量值可能会发生变化的场景。例如在 for 循环中声明循环变量,或者在 if 块内声明临时变量等。
  • const:用于声明那些值在整个程序运行过程中不会改变的常量,如数学常量(PI)、配置项(MAX_COUNT)等。对于对象和数组类型的常量,若希望其内部内容也不可变,可结合 Object.freeze() 使用。

综上所述,var、let 和 const 在 JavaScript 中各自具有独特的特性和适用场景。作为新手开发者,深入理解它们之间的区别,并在实际编程中正确使用,将有助于编写更加规范、健壮和易于维护的 JavaScript 代码。随着对 JavaScript 语言的不断学习和实践,能够更加熟练地运用这三种声明方式来满足不同的编程需求。

总结

到此这篇关于JavaScript中var、let和const的用法及区别的文章就介绍到这了,更多相关JS中var、let和const详解内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章