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 Typ der
global-Definition. Muss immer zuerst angegeben werden. identifierOptional-
Ein eindeutiger Name für die globale Variable. Dieser muss mit einem
$-Symbol beginnen, zum Beispiel$my_global. type-
Der Typ der zu erstellenden globalen Variable. Besteht aus einem
data_type, optional vorangestellt durch dasmut-Schlüsselwort:mutOptional-
Das
mut-Flag. Wenn enthalten, ist die globale Variable veränderlich — sie kann nach der Initialisierung über dieglobal.set-Anweisung auf einen anderen Wert gesetzt werden. data_type-
Der Datentyp der globalen Variable. Dieser kann einer der folgenden sein:
initial_value-
Der Initialisierer für die neue globale Variable. Sein Wert kann sein:
- Ein wörtlicher Wert, zum Beispiel
i32.const 0. - Ein
global.geteiner anderen globalen Variable. - Jeder andere Konstantausdruck.
Der
initial_value-Typ muss mit dem deklariertentypeübereinstimmen. - Ein wörtlicher Wert, zum Beispiel
Beschreibung
Die WebAssembly-Definition global ermöglicht es, global-gültige Variablen innerhalb eines Wasm-Moduls zu definieren. Globale Variablen können:
-
Über
global.getabgerufen und innerhalb des Moduls verwendet werden. -
Über
global.setverändert werden, vorausgesetzt, dass dasmut-Flag bei der Deklaration der globalen Variable enthalten war. Der Versuch, eine nicht veränderliche Variable zu verändern, führt zu einem Validierungsfehler. -
Exportiert werden, um sie in JavaScript zu verwenden. 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 Ausnahme (exnref) Typ enthält, können Sie sie exportieren, aber der Versuch, den Wert der globalen Variable über JavaScript zu lesen, führt zu einem TypeError.
Erstellen von globalen Variablen aus JavaScript
Es ist auch möglich, eine Wasm-Globale Variablen innerhalb des JavaScript-Hosts mit dem WebAssembly.Global()-Konstruktor zu erstellen und dann in das Modul zu importieren.
Zum Beispiel:
const myGlobal = new WebAssembly.Global({ value: "i32", mutable: true }, 0);
const { instance } = await WebAssembly.instantiateStreaming(
fetch("example.com/module"),
{
env: { myGlobal },
},
);
Teilen von globalen Variablen zwischen Modulen
Es ist möglich, globale Variablen, die innerhalb von Wasm-Modulen oder innerhalb des JavaScript-Hosts deklariert wurden, zwischen mehreren Modulen zu teilen.
Zum Beispiel wird der Zustand der unten erstellten globalen Variable zwischen zwei verschiedenen Modulen geteilt:
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
global.getglobal.setWebAssembly.GlobalJavaScript-Schnittstelle