WebAssembly.Global

WebAssembly.Global 对象表示一个全局变量实例,可以被 JavaScript 和 importable/exportable 访问,跨越一个或多个 WebAssembly.Module 实例。他允许被多个模块动态连接。

构造函数

WebAssembly.Global()

创建一个新的 Global 对象。

Global 实例

所有的 Global 实例继承自 Global() 构造函数的原型对象——修改会影响 所有 Global 实例。

实例属性

Global.prototype.constructor

返回创建对象实例的函数。缺省为构造函数为 WebAssembly.Global()

Global.prototype[Symbol.toStringTag]

属性 Symbol.toStringTag 初始值为字符串“WebAssembly.Global”。

Global.prototype.value

全局变量包含的值——可以直接用于设置和获取全局变量的值。

实例方法

Global.prototype.valueOf()

旧式的方法,返回全局变量包含的值。

示例

创建 Global 实例

以下例子展示了使用 WebAssembly.Global() 构造函数创建一个新的实例。它定义为可修饰的类型为i32,值为 0。

global 的值发生改变,首先设置Global.value 为 42,然后使用导出函数 incGlobal() 增加为 43. 导出函数在 global.wasm 模块中 (它将参数的值加一并返回).

js
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 上运行的实时示例;也可以查看源代码

规格

Specification
WebAssembly JavaScript Interface
# globals

浏览器兼容性

BCD tables only load in the browser

参见