WebAssembly.Global

WebAssembly.Global はグローバル変数として存在し、JavaScript または WebAssembly.Module インスタンスから参照することができます。これにより動的に複数のモジュールをリンクすることができます。

コンストラクターの文法

var myGlobal = new WebAssembly.Global(descriptor, value);

パラメーター

descriptor
GlobalDescriptor 辞書オブジェクト、2 つの要素を持っている:
  • valueUSVString はグローバルデータ形式を表し値として i32i64f32f64 のうち一つを取ります。
  • mutable: グローバルがミュータブルかどうかの真偽値です。デフォルトでは false です。
value
変数が保持する値です。変数のデータ型に合う限りどんな値でも取れます。もしも何の値も渡されないと、DefaultValue algorithm で指定した時の様な 型ありの 0 が使われます。

グローバルコンストラクターによる関数プロパティ

無し

グローバルインスタンス

すべてのグローバルインスタンスは Global() コンストラクターのプロパティオブジェクトを受け継ぐ — これによりすべての Global インスタンスを変更できる

インスタンスプロパティ

Global.prototype.constructor
Returns the function that created this object's instance. By default this is the WebAssembly.Global() constructor.
Global.prototype[@@toStringTag]
The initial value of the @@toStringTag property is the String value "WebAssembly.Global".
Global.prototype.value
The value contained inside the global variable — this can be used to directly set and get the global's value.

インスタンスメソッド

Global.prototype.valueOf()
Old-style method that returns the value contained inside the global variable.

以下の例では新しいグローバルインスタンスは WebAssembly.Global() コンストラクターを用いて初期化され、初期値 0 のミュータブルな i32 型として定義されます。

その後この値は、Global.value プロパティを使うことによって 42 に、global.wasm モジュールから公開された incGlobal() 関数 (入力に限らず 1 を加算する) を使うことによって 43 になります。

const output = document.getElementById('output');

function assertEq(msg, got, expected) {
    output.innerHTML += `Testing ${msg}: `;
    if (got !== expected)
        output.innerHTML += `FAIL!<br>Got: ${got}<br>Expected: ${expected}<br>`;
    else
        output.innerHTML += `SUCCESS! Got: ${got}<br>`;
}

assertEq("WebAssembly.Global exists", typeof WebAssembly.Global, "function");

const global = new WebAssembly.Global({value:'i32', mutable:true}, 0);

WebAssembly.instantiateStreaming(fetch('global.wasm'), { js: { global } })
.then(({instance}) => {
    assertEq("getting initial value from wasm", instance.exports.getGlobal(), 0);
    global.value = 42;
    assertEq("getting JS-updated value from wasm", instance.exports.getGlobal(), 42);
    instance.exports.incGlobal();
    assertEq("getting wasm-updated value from JS", global.value, 43);
});

メモ: GitHub 上で動くデモが試せます。ソースコードも確認してみてください。

仕様

仕様 策定状況 コメント
WebAssembly JavaScript Interface
WebAssembly.Global() の定義
草案 初回ドラフト定義

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
GlobalChrome 完全対応 69Edge 未対応 なしFirefox 完全対応 62IE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 完全対応 69Chrome Android 完全対応 69Firefox Android 完全対応 62Opera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 完全対応 10.0nodejs 未対応 なし
valueChrome 完全対応 69Edge 未対応 なしFirefox 完全対応 62IE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 完全対応 69Chrome Android 完全対応 69Firefox Android 完全対応 62Opera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 完全対応 10.0nodejs 未対応 なし
valueOfChrome 完全対応 69Edge 未対応 なしFirefox 完全対応 62IE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 完全対応 69Chrome Android 完全対応 69Firefox Android 完全対応 62Opera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 完全対応 10.0nodejs 未対応 なし

凡例

完全対応  
完全対応
未対応  
未対応

参考