弱引用支持
默认情况下,如果检测到支持,wasm-bindgen 会使用 TC39 弱引用提案。在撰写本文时,所有主要浏览器都支持它。
如果没有弱引用,您的 JS 集成可能会在 Rust 中容易出现内存泄漏,例如
- 您可能会忘记在 JS 对象上调用
.free()
,从而导致 Rust 内存被分配。 - 转换为 JS 值的 Rust 闭包(
Closure
类型)可能不会被执行和清理。 - Rust 闭包具有
Closure::{into_js_value,forget}
方法,这些方法明确不释放底层内存。
这些问题都通过 JS 中的弱引用提案得到解决。FinalizationRegistry
将确保所有内存都被清理,无论它是显式释放还是不释放。请注意,显式释放始终是一种可能性并且受支持,但如果没有调用它,那么如果检测到 FinalizationRegistry
支持,内存仍会自动释放。