Receiving JS Closures in Rust - The `wasm-bindgen` Guide

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Receiving JavaScript Closures in Exported Rust Functions

You can use the `js-sys` crate to access JavaScript's `Function` type, and invoke that function via `Function.prototype.apply` and `Function.prototype.call`.

For example, we can wrap a `Vec<u32>` in a new type, export it to JavaScript, and invoke a JavaScript closure on each member of the `Vec`:

    #![allow(unused)]
    fn main() {
    use wasm_bindgen::prelude::*;

    #[wasm_bindgen]
    pub struct VecU32 {
        xs: Vec<u32>,
    }

    #[wasm_bindgen]
    impl VecU32 {
        pub fn each(&self, f: &js_sys::Function) {
            let this = JsValue::null();
            for &x in &self.xs {
                let x = JsValue::from(x);
                let _ = f.call1(&this, &x);
            }
        }
    }
    }

Since Rust has no function overloading, the `call#` method also requires a number representing the amount of arguments passed to the JavaScript closure.