WebAssembly入门笔记[3]:利用Table传递引用 - Artech

WebAssembly入门笔记[3]:利用Table传递引用 - Artech

💡 原文中文,约6100字,阅读约需15分钟。
📝

内容提要

本文介绍了WebAssembly中的Table对象及其在JavaScript与wasm模块之间的交互。Table用于存储函数引用,支持funcref和externref类型。通过示例,展示了如何将wasm函数存储在Table中并通过JavaScript调用,以及如何将JavaScript函数存储在Table中供wasm模块使用。文章还讨论了call_indirect指令的使用,并强调了wasm对externref的限制。

🎯

关键要点

  • Table对象用于存储函数引用,支持funcref和externref类型。
  • 可以将wasm函数存储在Table中供JavaScript调用。
  • 通过call_indirect指令可以间接执行存储在Table中的wasm函数。
  • JavaScript函数只能以externref形式存储在Table中,wasm模块无法直接消费这些函数。
  • 可以将JavaScript函数回传到宿主JavaScript应用中执行。

延伸问答

WebAssembly中的Table对象有什么作用?

Table对象用于存储函数引用,支持funcref和externref类型,方便在JavaScript与wasm模块之间进行交互。

如何在JavaScript中调用存储在Table中的wasm函数?

可以通过获取Table对象并使用get方法来调用存储在Table中的wasm函数,例如table.get(index)(参数)。

为什么JavaScript函数不能直接存储在Table中供wasm模块使用?

因为JavaScript函数只能以externref形式存储在Table中,而wasm模块无法对externref进行解引用,因此不能直接消费这些函数。

call_indirect指令在WebAssembly中如何使用?

call_indirect指令用于间接调用存储在Table中的wasm函数,需指定函数的类型和参数。

如何将JavaScript函数回传到宿主应用中执行?

可以将JavaScript函数以externref形式存储在Table中,然后通过wasm模块调用宿主应用中的函数。

WebAssembly中的funcref和externref有什么区别?

funcref用于存储wasm原生函数,而externref用于存储宿主程序提供的JavaScript对象。

➡️

继续阅读