Undefined 与 Not Defined
Source: Dev.to
Undefined
undefined 是 JavaScript 中的一个特殊关键字。它表示 变量已经在内存中存在,但尚未被赋值。
在执行上下文的 创建阶段,JavaScript 会:
- 看到 如
var x的声明。 - 分配
x的内存。 - 赋予 默认值 →
undefined。
因为 x 的内存槽已经存在,在显式赋值之前访问 x 会输出 undefined,而不是抛出错误。
undefined 并不是“空的”;它占有自己的内存空间,充当占位符,直到变量获得具体的值。
Not Defined
“未定义”(not defined) 的情况发生在变量 从未被分配内存 时。
console.log(y); // ReferenceError: y is not defined
这个错误并不意味着“缺少值”;它表示 JavaScript 完全不知道标识符 y。
在创建阶段,JavaScript 会扫描声明(var、function、let、const)。由于 y 从未声明,根本没有创建内存槽,任何尝试访问它的操作都会导致 ReferenceError。
undefined→ 内存存在,值不存在。- not defined → 内存不存在。
这种判断发生在 代码执行之前,而不是运行时。
Creation vs. Execution Phases
JavaScript 将代码处理分为两个不同的阶段:
-
内存分配(创建阶段)
- 声明会被提升。
- 为变量创建内存槽,并且对于
var,初始化为undefined。
-
执行阶段
- 代码逐行运行,使用之前准备好的内存槽。
如果变量已经被分配(例如 var x),执行阶段可以读取它的值(在赋值之前为 undefined)。
如果变量从未被分配(例如 y),执行阶段会抛出 ReferenceError。
let and const
let 和 const 也会在创建阶段获得内存,但 JavaScript 会阻止在它们被初始化之前访问它们。这被称为 Temporal Dead Zone(暂时性死区,TDZ)。在声明之前读取它们会导致 ReferenceError,即使内存槽已经存在。
console.log(a); // ReferenceError: Cannot access 'a' before initialization
let a = 10;
Conclusion
undefined 与 “not defined” 并不仅仅是措辞上的细微差别;它们反映了 JavaScript 中根本不同的内存状态:
undefined– 已声明的变量存在于内存中,但尚未被赋值。- Not defined – 标识符根本未声明,因而没有内存槽。
理解这一区别有助于弄清 JavaScript 在代码运行前是如何准备的,并能避免常见的运行时错误。