WebAssembly.Table.prototype.set()

Baseline 已广泛支持

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

set() 实例方法用于将 WebAssembly.Table 对象中存储的引用更改为另一个值。

语法

js
set(index, value)

参数

index

要更改的函数引用的索引。

value

要将引用更改为的值。它必须是表的元素类型的值。根据类型,它可以是导出的 WebAssembly 函数、底层 Wasm 函数的 JavaScript 包装器或主机引用。

返回值

无(undefined)。

异常

示例

使用 Table.set

下面的示例(请参阅 table2.html 的源代码实时版本)创建了一个新的 WebAssembly Table 实例,其初始大小为两个引用。然后,我们打印表的长度以及两个索引的内容(通过 Table.prototype.get() 检索),以显示长度为 2,并且索引当前不包含任何函数引用(它们当前返回 null)。

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

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

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

最后,我们使用 WebAssembly.instantiateStreaming() 加载并实例化一个 Wasm 模块 (table2.wasm),打印表长度,并调用现在存储在表中的两个引用函数。table2.wasm 模块将两个函数引用添加到表中,这两个函数都会打印一个简单值(请参阅文本表示)。

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

浏览器兼容性

另见