Rust Wasm中Closure::new与Closure::wrap的区别及适用场景
Closure::new 与 Closure::wrap 的区别及适用场景 核心差异
- 所有权管理
Closure::new:接收一个拥有所有权的闭包(FnOnce/FnMut/Fn类型均可),会将闭包的所有权转移到Closure实例中。外部无法再使用原闭包变量,无需手动处理内存安全。Closure::wrap:接收指向已装箱闭包的原始指针(通常是Box<dyn Fn(...)>通过Box::into_raw生成的指针),它不获取闭包所有权,仅接管指针的管理权。操作是unsafe的,必须确保指针合法有效,否则会引发未定义行为。
适用场景
使用
Closure::new
直接创建全新闭包并绑定到 JS 环境的场景,比如给 DOM 事件绑定一次性回调:let click_callback = Closure::new(|_: web_sys::MouseEvent| { web_sys::console::log_1(&"按钮被点击".into()); }); button.add_event_listener_with_callback("click", click_callback.as_ref().unchecked_ref()).unwrap(); click_callback.forget(); // 避免闭包被提前drop导致回调失效使用
Closure::wrap
当你已有一个装箱后的闭包(比如从其他逻辑传递过来的Box<dyn FnMut(...)>),需要将其转换为Closure实例时使用:let boxed_fn: Box<dyn Fn() -> String> = Box::new(|| "Hello from wrapped closure".into()); let raw_ptr = Box::into_raw(boxed_fn); let wrapped_closure = unsafe { Closure::wrap(raw_ptr) }; // 后续可将wrapped_closure绑定到JS环境使用 wrapped_closure.forget();
内容的提问来源于stack exchange,提问作者Pytan
相关产品推荐
相关产品推荐

