WebAssembly.Global() 构造函数

一个 **WebAssembly.Global()** 构造函数创建一个新的 Global 对象,它表示一个全局变量实例,可以从 JavaScript 访问,并且可以跨一个或多个 WebAssembly.Module 实例导入/导出。这允许对多个模块进行动态链接。

语法

js
new WebAssembly.Global(descriptor, value)

参数

descriptor

一个包含两个属性的对象

  • value: 一个表示全局数据类型的字符串。可以是以下任何一个:
    • i32: 一个 32 位整数。
    • i64: 一个 64 位整数。(在 JavaScript 中,它表示为一个 BigInt
    • f32: 一个 32 位浮点数。
    • f64: 一个 64 位浮点数。
    • v128: 一个 128 位向量。
    • externref: 一个主机引用。
    • anyfunc: 一个函数引用。
  • mutable: 一个布尔值,用于确定全局变量是否可变。默认情况下,它是 false
value

变量包含的值。它可以是任何值,只要它的类型与变量的数据类型匹配。如果未指定值,则使用类型化的 0 值,其中 descriptor.value 的值为 i32i64f32f64 之一,如果 descriptor.valueexternrefanyfunc,则使用 null(如 DefaultValue 算法 所指定)。

示例

创建新的 Global 实例

以下示例显示了一个使用 WebAssembly.Global() 构造函数创建的新全局实例。它被定义为一个可变的 i32 类型,其值为 0。

然后更改全局变量的值,首先使用 Global.value 属性将其更改为 42,然后使用从 global.wasm 模块导出的 incGlobal() 函数将其更改为 43(它将 1 加到给定的任何值,然后返回新值)。

js
const output = document.getElementById("output");

function assertEq(msg, got, expected) {
  const result =
    got === expected
      ? `SUCCESS! Got: ${got}\n`
      : `FAIL!\nGot: ${got}\nExpected: ${expected}\n`;
  output.innerText += `Testing ${msg}: ${result}`;
}

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 接口
# dom-global-global

浏览器兼容性

BCD 表仅在浏览器中加载

另请参见