var声明的变量在提升阶段被初始化为undefined;let和const虽被提升但不初始化,处于暂时性死区(TDZ),访问即报错;函数声明则提升并初始化为函数对象。

变量在提升阶段的初始化,取决于声明方式——只有 var 声明的变量会在提升时被自动初始化为 undefined;let 和 const 虽然也会被“提升”,但不会初始化值,而是进入暂时性死区(TDZ),访问即报错。
var 声明:提升 + 初始化为 undefined
JavaScript 引擎在编译阶段(执行前)扫描到 var x,会做两件事:
- 在当前作用域的变量对象(VO)中创建一个名为
x的条目 - 将其初始值设为
undefined
所以以下代码不会报错,输出 undefined:
var x = 10;
let/const 声明:提升但不初始化
let 和 const 的声明同样会被提升到块级作用域顶部,但引擎不会赋予任何初始值。从作用域开头到声明语句之间,该变量处于暂时性死区(TDZ):
- 访问会直接抛出
ReferenceError - 初始化动作(赋值)只在执行到声明行时发生
例如:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
let y = 20;
函数声明:提升 + 初始化为函数对象
function 声明不仅被提升,还会把整个函数定义(而非仅名称)初始化为可调用的对象:
foo(); // 正常执行,输出 "hello"function foo() { console.log("hello"); }
这不同于函数表达式(var bar = function() {...}),后者只提升 var bar(初始化为 undefined),不提升函数体。
严格模式不影响初始化逻辑,但强化错误提示
启用 "use strict" 后,未声明就赋值(如 z = 42)会立即报错,但它不改变 var/let/const 在提升阶段的初始化行为——var 仍得 undefined,let/const 仍卡在 TDZ。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










