一、变量
在 JavaScript 中,变量 是用于存储数据的容器。你可以使用变量来保存和操作各种类型的数据。其中,声明变量、变量初始化和变量赋值是三个相关但不同的概念。下面是它们之间的区别与联系:
1. 变量声明
变量声明是定义变量的过程。它告诉 JavaScript 引擎你要创建一个变量,并指定该变量的名称。声明变量并不会立即赋值,只是创建了一个变量的“占位符”。
-
使用
var
、let
或const
来声明变量:var x; let y; const z; // 注意:`const` 变量必须在声明时初始化
注意:const 变量必须在声明时初始化
2. 变量初始化
变量初始化是给变量分配一个初始值的过程。初始化通常发生在声明变量时,也可以在之后的某个时刻进行。初始化是声明的一个扩展步骤。
-
在声明时初始化变量:
var a = 10; // 声明并初始化 let b = "hello"; // 声明并初始化 const c = true; // 声明并初始化,`const` 变量必须初始化
3. 变量赋值
变量赋值是将一个值存储到已经声明的变量中。如果变量已经被声明但未初始化,可以在之后通过赋值来设置它的值。赋值可以发生在变量声明之后的任意时间点。
-
声明后赋值:
var d; // 声明 d = 25; // 赋值let e; // 声明 e = "world"; // 赋值// 对于 `const` 变量,声明时必须初始化,不能单独赋值 // const f; // 会报错 // f = 30; // 也会报错
联系:
-
声明与初始化: 在声明变量时可以选择是否初始化。如果在声明时不进行初始化,变量的值将是
undefined
,直到你显式地赋值。var g; // 声明 console.log(g); // 输出 undefined,因为未初始化g = 15; // 赋值 console.log(g); // 输出 15
-
赋值与初始化: 初始化是赋值的一种形式,但赋值不仅仅限于初始化。初始化是在声明时完成的赋值,而一般的赋值是在变量声明之后进行的。
var h = 5; // 初始化(也是赋值) h = 10; // 赋值
总结:
声明 | 是创建变量的过程,不包含具体值。 |
初始化 | 是在声明时给变量赋一个初始值。 |
赋值 | 是将一个新值存储到变量中的过程,可能发生在声明后或初始化之后。 |
二、变量提升
变量提升(Hoisting)是 JavaScript 中的一种行为,指的是变量和函数声明在代码执行前被提升到其所在作用域的顶部。这意味着你可以在声明之前使用这些变量和函数。
变量提升的基本规则:
-
变量声明提升:
- 只有变量声明会被提升,而不是赋值。例如:
上面的代码等同于:console.log(x); // 输出:undefined var x = 5;
var x; console.log(x); // 输出:undefined x = 5;
- 只有变量声明会被提升,而不是赋值。例如:
-
函数声明提升:
- 函数声明会被完整提升,可以在声明之前调用。例如:
greet(); // 输出:Hello!function greet() {console.log('Hello!'); }
- 函数声明会被完整提升,可以在声明之前调用。例如:
-
let 和 const 的变量提升:
使用 let
和 const
声明的变量也会被提升,但不会初始化。在声明之前访问这些变量会抛出 ReferenceError
。例如:
console.log(a); // 报错:ReferenceError: Cannot access 'a' before initialization
let a = 5;
这类变量会处于“暂时性死区”(Temporal Dead Zone, TDZ)中,直到声明被执行前无法访问。
总结:
var 声明的变量和函数会被提升到作用域的顶部,变量会被初始化为 undefined 。 |
let 和 const 声明的变量也会被提升,但它们在声明之前不可用,试图访问这些变量会导致错误。 |