显式资源管理
本节目标:理解需要显式释放的资源,并识别
using/await using语法的运行时支持边界。
为什么需要资源管理
文件句柄、锁或临时资源在使用后需要释放。传统写法在 finally 中清理:
js
let resource;
try {
resource = acquireResource();
useResource(resource);
} finally {
resource?.close();
}清理代码需要覆盖成功、异常和提前返回等路径。显式资源管理规范提供 Symbol.dispose、Symbol.asyncDispose 及 using、await using,让资源在词法作用域退出时自动释放。
支持与使用条件
js
// 仅在运行时支持显式资源管理语法及所需对象时使用
{
using resource = createDisposableResource();
resource.run();
}using 绑定只在当前作用域有效,离开作用域时调用资源的同步释放方法;await using 等待异步释放。MDN 当前将 using 标记为尚未获得主流浏览器普遍支持的特性。语法和内置对象支持因引擎版本而异,使用前检查 MDN 兼容性表。不能假定所有浏览器或 Node.js 版本均可运行。
小结与练习
- 资源应在所有执行路径中释放。
- 新语法可减少清理样板,但必须确认运行时支持。
- 对兼容环境,
try...finally仍是通用模式。
练习:为一个拥有 close() 方法的资源编写安全的 try...finally 使用模板,并考虑获取资源本身失败的情况。