Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

global: Wasm-Definition

Die global Definition deklariert eine neue globale Variable.

Probieren Sie es aus

(module
  (import "console" "log" (func $log (param i32)))

  ;; Import a global variable from js
  (import "env" "from_js" (global $from_js i32))

  ;; Create a global variable
  (global $from_wasm (mut i32) (i32.const 10))

  (func $main
    ;; Set $from_wasm to a different value
    i32.const 20
    global.set $from_wasm

    ;; Load both global variables onto the stack
    global.get $from_js
    global.get $from_wasm

    i32.add ;; Add up both globals
    call $log ;; Log the result
  )
  (start $main)
)
const url = "{%wasm-url%}";
const from_js = new WebAssembly.Global({ value: "i32", mutable: false }, 5);
await WebAssembly.instantiateStreaming(fetch(url), {
  console,
  env: { from_js },
});

Syntax

global identifier type initial_value
global

Der global Definitionstyp. Muss immer zuerst angegeben werden.

identifier Optional

Ein identifizierender Name für die globale Variable. Dieser muss mit einem $-Symbol beginnen, zum Beispiel $my_global.

type

Der Typ der zu erstellenden globalen Variable. Dieser besteht aus einem data_type, optional vorangestellt durch das mut Schlüsselwort:

mut Optional

Das mut Flag. Wenn es enthalten ist, ist die globale Variable veränderlich — sie kann nach der Initialisierung über die global.set-Anweisung auf einen anderen Wert gesetzt werden.

data_type

Der Datentyp der globalen Variable. Dies kann einer der folgenden sein:

  • i32
  • i64
  • f32
  • f64
  • v128
  • funcref
  • externref
  • Andere Referenztypen wie Strukturen (zum Beispiel structref), Ausnahmen (zum Beispiel exnref), i31 (i31ref), etc.
initial_value

Der Initialisierer für die neue globale Variable. Sein Wert kann sein:

Der Typ von initial_value muss derselbe sein wie der deklarierte type.

Beschreibung

Die WebAssembly global Definition ermöglicht es, global-skopierte Variablen in einem Wasm-Modul zu definieren. Globale Variablen können:

  • Über global.get abgerufen und von überall innerhalb des Moduls verwendet werden.

  • Über global.set mutiert werden, vorausgesetzt, dass das mut Flag eingeschlossen wurde, als die globale Variable deklariert wurde. Der Versuch, eine nicht-veränderbare Variable zu mutieren, führt zu einem Validierungsfehler.

  • Exportiert werden, um sie in JavaScript einzubringen. Zum Beispiel:

    wat
    (global $my_global (mut i32) (i32.const 0))
    (export "my_global" (global $my_global))
    

Hinweis: Wenn eine globale Variable einen v128 (SIMD) oder Ausnahmetyp (exnref) enthält, können Sie sie exportieren, aber der Versuch, den Wert der globalen Variable über JavaScript zu lesen, führt zu einem TypeError.

Erstellung von globalen Variablen aus JavaScript

Es ist auch möglich, eine Wasm-Globale innerhalb des JavaScript-Hosts mithilfe des WebAssembly.Global() Konstruktors zu erstellen und sie dann in das Modul zu importieren.

Zum Beispiel:

js
const myGlobal = new WebAssembly.Global({ value: "i32", mutable: true }, 0);

const { instance } = await WebAssembly.instantiateStreaming(
  fetch("example.com/module"),
  {
    env: { myGlobal },
  },
);

Gemeinsame Nutzung globaler Variablen zwischen Modulen

Es ist möglich, globale Variablen, die innerhalb von Wasm-Modulen oder im JavaScript-Host deklariert wurden, zwischen mehreren Modulen zu teilen.

Zum Beispiel wird der Zustand der unten erstellten globalen Variable zwischen zwei verschiedenen Modulen geteilt:

js
const shared = new WebAssembly.Global({ value: "i32", mutable: true }, 0);

const modA = await instantiate(bytesA, { env: { shared } });
const modB = await instantiate(bytesB, { env: { shared } });

Spezifikationen

Diese Funktion scheint in keiner Spezifikation definiert zu sein.

Browser-Kompatibilität

Siehe auch