弱引用支持

默认情况下,如果检测到支持,wasm-bindgen 会使用 TC39 弱引用提案。在撰写本文时,所有主流浏览器都支持它。

没有弱引用,您的 JS 集成可能会在 Rust 中容易出现内存泄漏,例如

  • 您可能会忘记在 JS 对象上调用 .free(),从而导致 Rust 内存被分配。
  • 转换为 JS 值的 Rust 闭包(Closure 类型)可能不会被执行和清理。
  • Rust 闭包具有 Closure::{into_js_value,forget} 方法,它们明确地不释放底层内存。

这些问题都通过 JS 中的弱引用提案得到解决。FinalizationRegistry 将确保所有内存都被清理,无论它是否被显式释放。请注意,显式释放始终是可能的并且受支持,但如果它没有被调用,那么如果检测到 FinalizationRegistry 支持,内存仍然会自动释放。