当使用Closures向 JavaScript 提供回调时,有什么更好的方法来避免释放它们?wasm -bindgen 指南建议使用.forget
,但承认这本质上是内存泄漏。
通常我们会存储句柄以便稍后在适当的时间删除,但现在我们希望它是一个全局处理程序,所以我们使用该
forget
方法删除它而不会使闭包无效。请注意,这会在 Rust 中泄漏内存,因此应该明智地执行此操作!
它暗示将闭包存储到适合丢弃的时间。在alexcrichton 对上一个问题的回答中,他提到...
[...] 如果它 [...] 只被调用一次,那么您可以使用
Rc
/RefCell
将Closure
闭包本身放入内部(使用一些内部可变性恶作剧)
但他没有提供这种方法的例子。
Closure 文档还提供了一个将闭包的引用返回给 JavaScript 上下文以让它处理何时释放引用的示例。
如果我们要放弃
cb
这里,它将导致每当间隔过去时引发异常。相反,我们将句柄返回给 JS,以便 JS 决定何时取消间隔并释放闭包。
我还想象有一些方法可以#[wasm_bindgen]
在公共函数上使用生命周期或宏等功能来避免这个问题,但我很难弄清楚如何做到这一点。
我的问题是,使用.forget
从 Rust 传回 JavaScript 的闭包有哪些替代方法,我可以看看使用中每个选项的一些简单示例吗?