WebAssembly.Global

Baseline 已广泛支持

此功能已经成熟,并可在许多设备和浏览器版本上使用。自 ⁨2020 年 3 月⁩起,它已在各浏览器中推出。

WebAssembly.Global 对象表示一个全局变量实例,该实例可以从 JavaScript 访问,并且可以被一个或多个 WebAssembly.Module 实例导入/导出。这允许多个模块进行动态链接。

构造函数

WebAssembly.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.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 接口
# 全局变量

浏览器兼容性

另见