static{}块用于同步、单次、线程安全的类级初始化,适合需异常处理、多步操作、私有静态字段赋值或逻辑隔离的场景;不支持异步、禁止耗时操作与循环引用。

JavaScript 中用 static{} 块初始化,核心是把需要同步执行、只运行一次的类级逻辑封装进这个块里——它在类定义完成时立即执行,且天然线程安全(单次、同步、不可重入)。
什么时候该用 static{} 块
当静态属性的初始化不是简单赋值,而是涉及以下任一情况时,static{} 就比直接写 static prop = ... 更合适:
- 需要 try-catch 处理异常,比如读取环境变量或解析 JSON 配置
- 要按顺序执行多步操作,例如先校验再赋值、缓存预热、注册回调
- 需访问私有静态字段(
#field),类字段语法不支持直接初始化私有静态成员 - 想明确隔离初始化逻辑,避免把业务代码混在属性声明中
基本写法和注意事项
static{} 是一个独立代码块,写在 class 内部、任意位置(通常放在静态属性之后),语法简洁:
class ApiClient {
static #baseUrl;
static #timeout;
static defaultHeaders;
static {
try {
const env = process.env.NODE_ENV || 'development';
this.#baseUrl = env === 'production'
? 'https://api.example.com'
: 'http://localhost:3000';
this.#timeout = 5000;
this.defaultHeaders = Object.freeze({ 'Content-Type': 'application/json' });
} catch (err) {
console.warn('ApiClient init failed, using defaults');
this.#baseUrl = 'http://localhost:3000';
this.#timeout = 3000;
this.defaultHeaders = {};
}
}
}
注意几点:
立即学习“Java免费学习笔记(深入)”;
- 块内可用
this,指向当前类(如ApiClient),可读写其他静态成员 - 不能访问实例属性或方法,也不能用
super或new.target - 所有检查型错误(如
SyntaxError)必须捕获,否则类定义会失败 - 多个
static{}按源码顺序依次执行,彼此可见已声明但未赋值的静态字段(值为undefined)
和静态字段初始化的区别
ES2022+ 支持直接写 static prop = value,但它只适合纯表达式计算:
-
static PI = Math.PI;✅ 简单、无副作用 -
static config = JSON.parse(fs.readFileSync('./config.json'));❌ 同步 I/O 不该放这里,且无法捕获异常 -
static #cache = new Map();✅ 可以,但若需预填数据就得靠static{}
换句话说:静态字段赋值 = 初始化表达式;static{} = 初始化过程。前者轻量,后者可控。
常见误用提醒
几个容易踩的坑:
- 在
static{}里调用异步函数(如await fetch())——语法报错,它只接受同步代码 - 依赖尚未声明的静态字段,比如字段定义在块后面,又在块里读它:值是
undefined,不是报错 - 把耗时操作(如大文件解析、网络请求)塞进去——会卡住整个模块加载,影响启动性能
- 在块里创建实例并赋给静态字段,却意外触发类自身初始化(循环引用),导致
ReferenceError


















