js_namespace - The `wasm-bindgen` Guide

# `js_namespace = blah`

This attribute indicates that the JavaScript type is accessed through the given namespace. For example, the `WebAssembly.Module` APIs are all accessed through the `WebAssembly` namespace. `js_namespace` can be applied to any import (function or type) and whenever the generated JavaScript attempts to reference a name (like a class or function name) it'll be accessed through this namespace.

    #![allow(unused)]
    fn main() {
    #[wasm_bindgen]
    extern "C" {
        #[wasm_bindgen(js_namespace = console)]
        fn log(s: &str);

        type Foo;
        #[wasm_bindgen(constructor, js_namespace = Bar)]
        fn new() -> Foo;
    }

    log("hello, console!");
    Foo::new();
    }

This is an example of how to bind namespaced items in Rust. The `log` and `Foo::new` functions will be available in the Rust module and will be invoked as `console.log` and `new Bar.Foo` in JavaScript.

It is also possible to access the JavaScript object under the nested namespace. `js_namespace` also accepts the array of the string to specify the namespace.

    #![allow(unused)]
    fn main() {
    #[wasm_bindgen]
    extern "C" {
        #[wasm_bindgen(js_namespace = ["window", "document"])]
        fn write(s: &str);
    }

    write("hello, document!");
    }

This example shows how to bind `window.document.write` in Rust.

If all items in the `extern "C" { … }` block have the same `js_namespace = …`:

    #![allow(unused)]
    fn main() {
    #[wasm_bindgen]
    extern "C" {
        #[wasm_bindgen(js_namespace = Math)]
        fn random() -> f64;
        #[wasm_bindgen(js_namespace = Math)]
        fn log(a: f64) -> f64;
        // ...
    }
    }

Then that macro argument can also be moved to the outer block:

    #![allow(unused)]
    fn main() {
    #[wasm_bindgen(js_namespace = Math)]
    extern "C" {
        #[wasm_bindgen]
        fn random() -> f64;
        #[wasm_bindgen]
        fn log(a: f64) -> f64;
        // ...
    }
    }

`js_namespace = …` on an individual item takes precedence over the outer block's `js_namespace = …`.