写JavaScript的人,大概都踩过资源泄漏的坑。数据库连接没关、文件句柄挂着、事件监听器没拆——这些bug往往藏在代码深处,直到生产环境才爆雷。ES2026的usingawait using语法,就是冲着这个问题来的。

语法的核心思路很简单:把资源生命周期和代码块绑定。声明时用using代替constlet,引擎会在代码块结束时自动调用清理逻辑。不管是正常执行完、抛出异常、还是遇到return/break/continue,清理都会触发。这比try...finally省了不少样板代码。

打开网易新闻 查看精彩图片

实现这套机制靠的是两个符号:Symbol.dispose用于同步清理,Symbol.asyncDispose用于异步场景。对象只要实现了对应方法,就能配合usingawait using使用。如果声明时拿到的值没有实现协议,引擎会立即抛TypeError,而不是等到清理阶段才发现问题。

打开网易新闻 查看精彩图片

多个资源同时声明时,清理顺序是后进先出(LIFO)。比如先声明配置对象、再声明数据库连接,退出时会先关连接、再清配置。这种设计避免了依赖资源被提前释放导致的野指针问题。如果清理过程中抛出异常,引擎会把所有错误聚合成SuppressedError链,确保没有失败被吞掉。

打开网易新闻 查看精彩图片

await using的用法限制更严:只能在async函数、异步生成器、模块顶层、以及异步循环里使用。引擎会优先找Symbol.asyncDispose,找不到就回退到Symbol.dispose,把同步清理包装成异步调用。这个回退机制让旧代码也能平滑迁移。