You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:04:54