此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

WebAssembly.Global

基线 广泛可用

自 2020年3月 起,此特性已在主流浏览器中得到支持,可在大多数设备和浏览器版本中正常使用。

WebAssembly.Global 对象表示一个全局变量实例,可以在 JavaScript 中访问,也可以在 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() 构造函数创建一个新的 global 实例。它被定义为可变的 i32 类型,值为 0。

然后改变 global 的值,首先用 Global.value 属性设置为 42,然后用从 global.wasm 模块导出的 incGlobal() 函数设置为 43(它将接收到的参数的值加 1 并返回)。

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

function assertEq(msg, got, expected) {
  const result =
    got === expected
      ? `成功!获得:${got}\n`
      : `失败!\n获得:${got}\n期望的是:${expected}\n`;
  output.innerText += `测试${msg}:${result}`;
}

assertEq("WebAssembly.Global 存在", typeof WebAssembly.Global, "function");

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

WebAssembly.instantiateStreaming(fetch("global.wasm"), { js: { global } }).then(
  ({ instance }) => {
    assertEq("从 wasm 获取初始值", instance.exports.getGlobal(), 0);
    global.value = 42;
    assertEq("从 wasm 获取用 JS 更新的值", instance.exports.getGlobal(), 42);
    instance.exports.incGlobal();
    assertEq("从 JS 获取用 wasm 更新的值", global.value, 43);
  },
);

备注:你可以查看在 GitHub 上实时运行的示例;也可以查看源代码

规范

规范
WebAssembly JavaScript Interface
# globals

浏览器兼容性

参见