WebAssembly.Table

Baseline 已广泛支持

此功能已非常成熟,可在多种设备和浏览器版本上使用。自 2017 年 10 月以来,它已在各大浏览器中可用。

WebAssembly.Table 对象是一个 JavaScript 包装器对象 — 一个类数组结构,代表一个 WebAssembly 表,它存储同质的引用。由 JavaScript 或 WebAssembly 代码创建的表将可以在 JavaScript 和 WebAssembly 中访问和修改。

注意:目前表只能存储函数引用或宿主引用,但未来可能会扩展。

构造函数

WebAssembly.Table()

创建一个新的 Table 对象。

实例属性

Table.prototype.length 只读

返回表的长度,即表中元素的数量。

实例方法

Table.prototype.get()

访问器函数 — 获取存储在给定索引处的元素。

Table.prototype.grow()

通过指定数量的元素来增加 Table 实例的大小。

Table.prototype.set()

将给定索引处的元素设置为给定值。

示例

创建一个新的 WebAssembly 表实例

下面的示例(请参阅 table2.html 的 源代码实时版本)创建了一个初始大小为 2 个元素的新的 WebAssembly 表实例。然后,我们打印出表长度和两个索引的内容(通过 Table.prototype.get() 获取),以显示长度为 2,并且两个元素都是 null

js
const tbl = new WebAssembly.Table({ initial: 2, element: "anyfunc" });
console.log(tbl.length); // "2"
console.log(tbl.get(0)); // "null"
console.log(tbl.get(1)); // "null"

然后,我们创建一个包含该表的导入对象

js
const importObj = {
  js: { tbl },
};

最后,我们使用 WebAssembly.instantiateStreaming() 方法加载并实例化一个 Wasm 模块 (table2.wasm)。table2.wasm 模块包含两个函数(一个返回 42,另一个返回 83),并将它们存储到导入表的元素 0 和 1 中(请参阅 文本表示)。因此,实例化后,表仍然长度为 2,但现在元素包含可调用的 导出的 WebAssembly 函数,我们可以在 JS 中调用它们。

js
WebAssembly.instantiateStreaming(fetch("table2.wasm"), importObject).then(
  (obj) => {
    console.log(tbl.length);
    console.log(tbl.get(0)());
    console.log(tbl.get(1)());
  },
);

请注意,您需要在访问器末尾包含第二个函数调用运算符才能实际调用引用的函数并记录其中存储的值(例如,get(0)() 而不是 get(0))。

此示例表明我们正在从 JavaScript 创建和访问该表,但同一个表在 Wasm 实例内部也是可见和可调用的。

规范

规范
WebAssembly JavaScript 接口
# tables

浏览器兼容性

另见