--- title: Экспортируемые функции WebAssembly slug: WebAssembly/Exported_functions tags: - JavaScript - WebAssembly - wasm - Экспортированные функции translation_of: WebAssembly/Exported_functions ---
Экспортированные функции WebAssembly - это функции вашего модуля доступные в JavaScript. В этой статье более подробно описывается, что они из себя представляют.
Экспортированные функции это просто JavaScript обертки, которые вызывают функции модуля WebAssembly. При их использовании происходит неявное преобразование типов аргументов функции в типы, с которыми может работать WebAssembly (например, преобразование number в int32). Дальше эти аргументы передаются функции вашего модуля и она вызывается. Результат также преобразовывается и возвращается в JavaScript.
Вы можете получить список экспортированных функций двумя способами:
Table.prototype.get()
у существующей таблице;Instance.exports
существующего экземпляра модуля.В любом случае вы получаете одну и туже обертку функции вашего модуля. С точки зрения JavaScript, все экспортированные функции wasm являются функциями JavaScript, но они инкапсулированы экземпляром модуля wasm, и имеют только ограниченный способ доступа к ним.
Давайте посмотрим на пример, чтобы прояснить ситуацию (вы можете найти его на GitHub как table-set.html или запустить в своем браузере, и посмотреть текстовое представление модуля wasm):
var otherTable = new WebAssembly.Table({ element: "anyfunc", initial: 2 }); WebAssembly.instantiateStreaming(fetch('table.wasm')) .then(obj => { var tbl = obj.instance.exports.tbl; console.log(tbl.get(0)()); // 13 console.log(tbl.get(1)()); // 42 otherTable.set(0,tbl.get(0)); otherTable.set(1,tbl.get(1)); console.log(otherTable.get(0)()); console.log(otherTable.get(1)()); });
Здесь мы создаем таблицу otherTable
из JavaScript используя конструктор {{jsxref("WebAssembly.Table")}}, после этого мы загружаем модуль table.wasm
при помощи функции {{jsxref("WebAssembly.instantiateStreaming()")}}.
Затем мы получаем объект содержащий все функции, экспортированные из экземпляра модуля. Извлекаем ссылки на эти функции через tbl.get(),
вызываем их и выводим результат работы в консоль. Затем мы используем set()
чтобы таблица otherTable
содержала ссылки на те же функции, что и таблица tbl
.
Чтобы доказать это, мы получаем ссылки на функции из таблицы otherTable
и вызываем их. При выводе в консоль они дают такие же результаты.
В предыдущем примере возвращаемое значение каждого вызова Table.prototype.get()
является экспортированной функцией WebAssembly — это именно то, о чем мы говорили.
Стоит заметить что помимо того что они являются обертками для функций WebAssembly, это обычные функции JavaScript. Если вы загрузите приведенный выше пример в браузере с поддержкой WebAssembly, и запустите следующие строки в консоли:
var testFunc = otherTable.get(0); typeof testFunc;
результатом выполнения будет function
. Вы можете сделать с ней все тоже самое что и с другими функциями в JavaScript — call()
, bind()
и т.д. Вызов testFunc.toString()
возвращает интересный результат:
function 0() { [native code] }
Это наводит на мысль о том что эта функция является оберткой.
Дополнительные сведения которые нужно знать при работе с экспортированными функциями:
toString()
индекса функции в модуле wasm.