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-
变量包含的值。它可以是任意值,只要它的类型和变量的数据类型相匹配。如果没有指定值,当
descriptor.value的值是i32、i64、f32或f64其中之一时,该值为对应类型的 0,如果descriptor.value是externref或anyfunc时,该值为null(由DefaultValue算法指定)。
示例
>创建一个新的 Global 实例
下面的例子展示的是用 WebAssembly.Global() 构造函数创建一个新的 global 实例。它被定义为可变的 i32 类型,值为 0。
然后改变 global 的值,首先用 Global.value 属性设置为 42,然后用从 global.wasm 模块导出的 incGlobal() 函数(它将接收到的参数的值加 1 并返回)设置为 43。
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> # dom-global-global> |