Undefined 与 Not Defined

发布: (2026年2月24日 GMT+8 23:30)
4 分钟阅读
原文: Dev.to

Source: Dev.to

Undefined

undefined 是 JavaScript 中的一个特殊关键字。它表示 变量已经在内存中存在,但尚未被赋值

在执行上下文的 创建阶段,JavaScript 会:

  1. 看到var x 的声明。
  2. 分配 x 的内存。
  3. 赋予 默认值 → undefined

因为 x 的内存槽已经存在,在显式赋值之前访问 x 会输出 undefined,而不是抛出错误。

undefined 并不是“空的”;它占有自己的内存空间,充当占位符,直到变量获得具体的值。


Not Defined

“未定义”(not defined) 的情况发生在变量 从未被分配内存 时。

console.log(y); // ReferenceError: y is not defined

这个错误并不意味着“缺少值”;它表示 JavaScript 完全不知道标识符 y

在创建阶段,JavaScript 会扫描声明(varfunctionletconst)。由于 y 从未声明,根本没有创建内存槽,任何尝试访问它的操作都会导致 ReferenceError

  • undefined → 内存存在,值不存在。
  • not defined → 内存不存在。

这种判断发生在 代码执行之前,而不是运行时。


Creation vs. Execution Phases

JavaScript 将代码处理分为两个不同的阶段:

  1. 内存分配(创建阶段)

    • 声明会被提升。
    • 为变量创建内存槽,并且对于 var,初始化为 undefined
  2. 执行阶段

    • 代码逐行运行,使用之前准备好的内存槽。

如果变量已经被分配(例如 var x),执行阶段可以读取它的值(在赋值之前为 undefined)。
如果变量从未被分配(例如 y),执行阶段会抛出 ReferenceError


let and const

letconst 也会在创建阶段获得内存,但 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 在代码运行前是如何准备的,并能避免常见的运行时错误。

0 浏览
Back to Blog

相关文章

阅读更多 »

Algorhymer的故事:寻找Nessie

又一本带原声带的 Computer Science flipbook!上次我们做了一个带 cold opening 的 time traveling Action Movie https://dev.to/algorhymer/tales-of-the-al