静态代码块(static { ... })是ES2022引入的特性,用于在类定义时一次性执行同步初始化逻辑,支持访问/赋值静态属性、调用静态方法、try/catch等,但不支持await、super或返回值。

JavaScript 的 class 中,静态代码块(static block)是 ES2022 引入的特性,专为在类定义时**一次性执行初始化逻辑**而设计,特别适合用来初始化复杂的静态属性(比如需计算、需异步准备但实际同步完成、或依赖其他静态字段的值)。
静态代码块的基本写法和执行时机
静态代码块用 static { ... } 语法声明,它在类定义被求值(evaluate)时立即执行,且只执行一次。它比静态字段初始化更早运行(按代码顺序),也早于任何实例创建或静态方法调用。
例如:
class Config {
static defaultTimeout = 5000;
static env = 'production';
static endpoints;
static authHeader;
static {
// 可基于其他静态字段计算初始化
this.endpoints = {
api: `https://api.${this.env}.example.com`,
upload: `https://upload.${this.env}.example.com`
};
// 可执行带逻辑的赋值(如条件判断、对象深拷贝等)
this.authHeader = this.env === 'development'
? { Authorization: 'Bearer dev-token' }
: { Authorization: 'Bearer prod-token' };
}
}
console.log(Config.endpoints.api); // "https://api.production.example.com"
静态代码块能做什么(和不能做什么)
✅ 支持:访问和赋值 this(指向当前类)、读写静态属性、调用静态方法、使用 try/catch、声明局部变量、执行任意同步逻辑。
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
❌ 不支持:使用 await(必须同步)、访问 super、作为表达式返回值、出现在类体之外或嵌套在其他块中。
- 若需异步初始化(如从 localStorage 或 config API 加载),应改用静态方法 + 显式调用,或配合
Promise+ 缓存处理 - 多个静态代码块按出现顺序依次执行,可拆分关注点(如一个初始化数据,一个校验配置)
与静态字段初始化的对比
静态字段(static prop = value)适合简单、无副作用的初始化(字面量、函数引用、简单表达式)。但遇到以下情况,静态代码块更合适:
- 需要
if/else或循环逻辑 - 需复用中间计算结果(避免重复计算多个字段)
- 要捕获初始化异常并降级(如 fallback 值)
- 依赖尚未声明但已提升的静态字段(注意:字段声明有提升,但赋值按顺序;
static block中可安全读取之前声明的字段)
示例:用静态代码块做错误防护
class Logger {
static level;
static loggers = new Map();
static {
try {
const levelStr = localStorage.getItem('logLevel') || 'info';
this.level = ['debug', 'info', 'warn', 'error'].includes(levelStr)
? levelStr
: 'info';
} catch {
this.level = 'info'; // 降级处理
}
}
}
实用建议
静态代码块不是“必须”,而是“更清晰”。当初始化逻辑超过一行且含控制流时,优先考虑它。
- 保持块内逻辑专注——只做初始化,不触发副作用(如发请求、修改全局状态)
- 避免在块中修改非当前类的静态数据,以防隐式耦合
- 单元测试时,可通过重置静态属性 + 重新执行类定义(如在模块作用域内)来覆盖测试不同分支

















