recursal/MDN huggingface dataset:
WebAssembly
===========

**`WebAssembly`** JavaScript 对象是所有 WebAssembly 相关功能的命名空间。

和大多数全局对象不一样，`WebAssembly`不是一个构造函数（它不是一个函数对象）。它类似于 `Math` 对象或者 `Intl` 对象，Math 对象也是一个命名空间对象，用于保存数学常量和函数；Intl 则是用于国际化和其他语言相关函数的命名空间对象。

描述
--

`WebAssembly` 对象主要用于：

* 使用 `WebAssembly.instantiate()` 函数加载 WebAssembly 代码。
* 通过 `WebAssembly.Memory()`/`WebAssembly.Table()` 构造函数创建新的内存和表实例。
* 由 `WebAssembly.CompileError()`/`WebAssembly.LinkError()` (en-US)/`WebAssembly.RuntimeError()` 构造函数来提供 WebAssembly 中的错误信息。
方法
--

`WebAssembly.instantiate()`

用于编译和实例化 WebAssembly 代码的主 API，返回一个 `Module` 和它的第一个`Instance`实例。

`WebAssembly.instantiateStreaming()`

直接从流式底层源编译和实例化 WebAssembly 模块，同时返回`Module`及其第一个`Instance`实例。

`WebAssembly.compile()`

把 WebAssembly 二进制代码编译为一个 `WebAssembly.Module` ，不进行实例化。

`WebAssembly.compileStreaming()`

直接从流式底层源代码编译`WebAssembly.Module` ，将实例化作为一个单独的步骤。

`WebAssembly.validate()`

校验 WebAssembly 二进制代码的类型数组是否合法，合法则返回 true，否则返回 false。

构造器
---

`WebAssembly.Global()`

创建一个新的 WebAssembly `Global` 全局对象。

`WebAssembly.Module()`

创建一个新的 WebAssembly `Module`模块对象。

`WebAssembly.Instance()`

创建一个新的 WebAssembly `Instance`实例对象。

`WebAssembly.Memory()`

创建一个新的 WebAssembly `Memory`内存对象。

`WebAssembly.Table()`

创建一个新的 WebAssembly `Table`表格对象。

`WebAssembly.CompileError()`

创建一个新的 WebAssembly `CompileError`编译错误对象。

`WebAssembly.LinkError()` (en-US)

创建一个新的 WebAssembly `LinkError`链接错误对象。

`WebAssembly.RuntimeError()`

创建一个新的 WebAssembly `RuntimeError`运行时错误对象。

示例
--

下面的示例（请参见 GitHub 上的 Instantiate-streaming.html 演示，并查看在线演示）直接从流式底层源传输 .wasm 模块，然后对其进行编译和实例化，并通过 `ResultObject` 实现 promise。由于 `instantiateStreaming()` 函数接受对 `Response` 对象的 promise，因此你可以直接向其传递 `fetch()` 调用，然后它将把返回的 response 传递给随后的函数。


```js
var importObject = { imports: { imported\_func: (arg) => console.log(arg) } };

WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
  (obj) => obj.instance.exports.exported\_func(),
);
```


返回的`ResultObject`实例的成员可以被随后访问到，可以调用实例中被导出的方法。

规范
--

| Specification |
| --- |
| WebAssembly JavaScript Interface # webassembly-namespace |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* WebAssembly overview page
* WebAssembly concepts
* Using the WebAssembly JavaScript API
WebAssembly.Memory()
====================

**`WebAssembly.Memory()`** 构造函数创建一个新的 `Memory` 对象。该对象的 `buffer` (en-US) 属性是一个可调整大小的 ArrayBuffer ，其内存储的是 WebAssembly `实例` 所访问内存的原始字节码。

从 JavaScript 或 WebAssembly 中所创建的内存，可以由 JavaScript 或 WebAssembly 来访问及更改。

语法
--
```

var myMemory = new WebAssembly.Memory(memoryDescriptor);
```

### 参数

*memoryDescriptor*

一个可包含以下成员的对象：

*initial*

WebAssembly 内存的初始大小，以 WebAssembly 页面为单位。

*maximum 可选*

以 WebAssembly 页面为单位，可允许 WebAssembly 内存的 `最大值`。当存在此属性时，此参数用于提示引擎预先保留内存。但是，引擎可能会忽略或限制此预留请求。通常情况下大多数 WebAssembly 模块不需要设置 `最大值`。


**备注：** A WebAssembly 页面的大小为一个常量 65,536 字节，即 64KB。

### 异常

* 如果 `memoryDescriptor` 的类型不是对象，则抛出 `TypeError` 异常。
* 如果指定了 `maximum` 并且小于 `initial`，则抛出 `RangeError` 异常。
`Memory` 实例
-----------

所有 `Memory` 实例都继承自 `Memory()` 构造函数的 原型对象 (en-US) — 这个原型可被修改并影响到所有的 `Memory` 实例。

### 实例属性

`Memory.prototype.constructor`

返回创建此对象实例的函数。默认情况下，它是 `WebAssembly.Memory()` 构造函数。

`Memory.prototype.buffer` (en-US)

一个访问器，用于返回内存中包含的缓冲区。

### 实例方法

`Memory.prototype.grow()` (en-US)

通过指定 WebAssembly 页面数量来增加内存实例的大小。（每个页面大小为 64KB）

示例
--

有两种方法可以获得 `WebAssembly.Memory` 对象。第一种方法是由 JavaScript 来创建。以下示例创建了一个新的 WebAssembly 内存实例，初始大小为 10 页（640KB），最大值设置为 100 页（6.4MB）。


```js
var memory = new WebAssembly.Memory({ initial: 10, maximum: 100 });
```


获取 `WebAssembly.Memory` 对象的第二种方法是从 WebAssembly 模块中导出。以下示例（详见 GitHub 页面 memory.html ，也可以 用浏览器运行查看）使用 `WebAssembly.instantiateStreaming()` 方法实例化已加载的 memory.wasm 字节代码，同时导入上面一行中创建的内存。用它来存储一些值，然后导出一个函数并用它来对一些值进行求和操作。


```js
WebAssembly.instantiateStreaming(fetch("memory.wasm"), {
  js: { mem: memory },
}).then((obj) => {
  var i32 = new Uint32Array(memory.buffer);
  for (var i = 0; i < 10; i++) {
    i32[i] = i;
  }
  var sum = obj.instance.exports.accumulate(0, 10);
  console.log(sum);
});
```

标准规范
----

| Specification |
| --- |
| WebAssembly JavaScript Interface # memories |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* WebAssembly overview page
* WebAssembly concepts
* Using the WebAssembly JavaScript API
WebAssembly.Global
==================

**`WebAssembly.Global`** 对象表示一个全局变量实例，可以被 JavaScript 和 importable/exportable 访问 ,跨越一个或多个`WebAssembly.Module` 实例。他允许被多个 modules 动态连接。

构造函数语法
------

**WebAssembly.Global()**

创建一个新的`全局`对象。

Global 实例
---------

所有的 `Global` 实例 继承自 `Global()` 构造函数 prototype object (en-US) — 修改会影响 所有 `Global` 实例。

### 实例属性

`Global.prototype.constructor`

返回创建对象实例的函数。缺省为构造函数为 `WebAssembly.Global()`

`Global.prototype[@@toStringTag]`

属性 @@toStringTag 初始值为字符串 "WebAssembly.Global".

`Global.prototype.value`

全局变量包含的值 — 可以直接用于设置和获取全局变量的值。

### 实例方法

`Global.prototype.valueOf()`

旧式的方法，返回全局变量包含的值。

示例
--

### 创建 Global 实例

以下例子展示了使用 `WebAssembly.Global()` 构造函数创建一个新的实例。它定义为可修饰的类型为`i32`，值为 0。

global 的值发生改变，首先设置`Global.value` 为 42，然后使用导出函数 `incGlobal()` 增加为 43. 导出函数在 `global.wasm` 模块中 (它将参数的值加一并返回).


```js
const output = document.getElementById("output");

function assertEq(msg, got, expected) {
  output.innerHTML += `Testing ${msg}: `;
  if (got !== expected)
    output.innerHTML += `FAIL!<br>Got: ${got}<br>Expected: ${expected}<br>`;
  else output.innerHTML += `SUCCESS! Got: ${got}<br>`;
}

assertEq("WebAssembly.Global exists", typeof WebAssembly.Global, "function");

const global = new WebAssembly.Global({ value: "i32", mutable: true }, 0);

WebAssembly.instantiateStreaming(fetch("global.wasm"), { js: { global } }).then(
  ({ instance }) => {
    assertEq(
      "getting initial value from wasm",
      instance.exports.getGlobal(),
      0,
    );
    global.value = 42;
    assertEq(
      "getting JS-updated value from wasm",
      instance.exports.getGlobal(),
      42,
    );
    instance.exports.incGlobal();
    assertEq("getting wasm-updated value from JS", global.value, 43);
  },
);
```


**备注：** 你可以查看 GitHub 上运行的实时示例；也可以查看源代码。

规格
--

| Specification |
| --- |
| WebAssembly JavaScript Interface # globals |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* WebAssembly overview page
* WebAssembly concepts
* Using the WebAssembly JavaScript API
* Import/Export mutable globals proposal
WebAssembly.Module
==================

**`WebAssembly.Module`** 对象包含已经由浏览器编译的无状态 WebAssembly 代码，可以高效地与 Worker 共享和多次实例化。

构造函数
----

`WebAssembly.Module()` (en-US)

创建一个新的 `Module` 对象。

静态属性
----

`WebAssembly.Module.customSections()` (en-US)

给定一个 `Module` 和字符串，返回模块中具有给定字符串名称的所有自定义的部分的内容副本。

`WebAssembly.Module.exports()` (en-US)

给定一个 `Module`，返回一个数组，其中包含所有声明的导出的描述。

`WebAssembly.Module.imports()` (en-US)

给定一个 `Module`，返回一个数组，其中包含所有声明的导入的描述。

示例
--

### 将编译后的模块发送到 worker

以下示例将使用 `WebAssembly.compileStreaming()` 方法编译 `simple.wasm` 加载后的字节码，并将返回的 `Module` 实例通过 `postMessage()` 发送到一个 worker。

参见 `index-compile.html` 的源代码，或查看在线演示。


```js
const worker = new Worker("wasm\_worker.js");

WebAssembly.compileStreaming(fetch("simple.wasm")).then((mod) =>
  worker.postMessage(mod),
);
```


Worker 函数 `wasm_worker.js` 定义了模块需要使用的导入对象。然后，该函数会创建一个事件处理器，以接受主线程发送的模块。在接收到模块后，我们使用 `WebAssembly.instantiate()` 方法创建一个它的实例，然后调用其导出的函数。


```js
const importObject = {
  imports: {
    imported\_func(arg) {
      console.log(arg);
    },
  },
};

onmessage = (e) => {
  console.log("module received from main thread");
  const mod = e.data;

  WebAssembly.instantiate(mod, importObject).then((instance) => {
    instance.exports.exported\_func();
  });
};
```

规范
--

| Specification |
| --- |
| WebAssembly JavaScript Interface # modules |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* WebAssembly 概览页面
* WebAssembly 概念
* 使用 WebAssembly JavaScript API
WebAssembly.compileStreaming()
==============================

**`WebAssembly.compileStreaming()`** 方法用来从一个流式源中直接编译一个 `WebAssembly.Module`。当模块需要在被实例化前被编译时，这个方法会很有用。如果要从流式源实例化一个模块应采用 `WebAssembly.instantiateStreaming()` 方法。

语法
--
```

Promise<WebAssembly.Module> WebAssembly.compileStreaming(source);
```

### 参数

*source*

一个 `Response` 对象或一个会履行（fulfill）它的 promise，用来表示你想编译的 .wasm 模块的流式源。

### 返回值

一个会被解决（resolve）为编译后的 `WebAssembly.Module` 对象的 `Promise`。

### 异常

* 如果 `bufferSource` 不是一个 typed array，将会抛出 `TypeError` 异常。
* 如果编译失败，promise 会通过拒绝（reject）来返回一个 `WebAssembly.CompileError`。
示例
--

下面的例子（在 GitHub 上查看我们的 compile-streaming.html 示例或者直接在线预览）直接从流式源传输一个 .wasm 模块然后将其编译为一个 `WebAssembly.Module` 对象。因为 `compileStreaming()` 方法可以接受一个结果为 `Response` 对象的 promise，因此你可以直接用 `fetch()` 的调用结果来调用该方法。


```js
var importObject = { imports: { imported\_func: (arg) => console.log(arg) } };

WebAssembly.compileStreaming(fetch("simple.wasm"))
  .then((module) => WebAssembly.instantiate(module, importObject))
  .then((instance) => instance.exports.exported\_func());
```


得到的 module 实例接下来通过 `WebAssembly.instantiate()` 方法被实例化了，然后调用模块导出的函数。

Specifications
--------------

| Specification |
| --- |
| WebAssembly Web API # dom-webassembly-compilestreaming |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* WebAssembly overview page
* WebAssembly concepts
* Using the WebAssembly JavaScript API
WebAssembly.CompileError()
==========================

\*\*`WebAssembly.CompileError()`\*\*构造函数创建一个新的 WebAssembly `CompileError`对象，该对象表示 WebAssembly 解码或验证期间的错误。

语法
--
```

new WebAssembly.CompileError(message, fileName, lineNumber)
```

### 参数

`message` 可选

有可读性的错误描述。

`fileName` 可选
非标准

包含导致异常的代码的文件名。

`lineNumber` 可选
非标准

导致异常的代码的行号。

属性
--

*`CompileError`构造函数没有一些它特有的属性，但是，它确实通过原型链继承了某些属性。*

`WebAssembly.CompileError.prototype.constructor`

创建示例原型的特定函数。

`WebAssembly.CompileError.prototype.message`

错误信息。尽管 ECMA-262 指定 `URIError` 应提供自己的 `message` 属性，但在 SpiderMonkey 中，它继承了 `Error.prototype.message`。

`WebAssembly.CompileError.prototype.name`

错误名称。继承自 `Error`。

`WebAssembly.CompileError.prototype.fileName`

报出错误的文件名。继承自 `Error`。

`WebAssembly.CompileError.prototype.lineNumber`

报出错误的代码所在文件中的行数。继承自 `Error`。

`WebAssembly.CompileError.prototype.columnNumber`

报出错误的代码所在文件中的列数。继承自 `Error`。

`WebAssembly.CompileError.prototype.stack`

堆栈跟踪。继承自`Error`。

方法
--

*`CompileError`构造函数不包含自己的方法，但是，它确实通过原型链继承了一些方法。*

`WebAssembly.CompileError.prototype.toSource()`

返回可能导致相同错误的代码。继承自`Error`。

`WebAssembly.CompileError.prototype.toString()`

返回表示代表指定的`Error`对象的字符串。从 `Error`继承。

示例
--

以下代码段创建一个新的 CompileError 实例，并将其详细信息记录到控制台：


```js
try {
  throw new WebAssembly.CompileError("Hello", "someFile", 10);
} catch (e) {
  console.log(e instanceof CompileError); // true
  console.log(e.message); // "Hello"
  console.log(e.name); // "CompileError"
  console.log(e.fileName); // "someFile"
  console.log(e.lineNumber); // 10
  console.log(e.columnNumber); // 0
  console.log(e.stack); // 返回代码运行的位置
}
```

规范
--

| Specification |
| --- |
| WebAssembly JavaScript Interface # exceptiondef-compileerror |
| ECMAScript Language Specification # sec-native-error-types-used-in-this-standard |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* WebAssembly overview page
* WebAssembly concepts
* Using the WebAssembly JavaScript API
WebAssembly.Table
=================

**`WebAssembly.Table`** 是代表 WebAssembly Table 的 JavaScript 包装对象，具有类数组结构，存储了多个函数引用。在 JavaScript 或者 WebAssemble 中创建的 Table 对象可以同时被 JavaScript 或 WebAssembly 访问和更改。

**备注：** Table 对象目前只能存储函数引用，不过在将来可能会被扩展。

构造函数
----

`WebAssembly.Table()` (en-US)

创建一个新的 `Table` 对象。

### 实例属性

`Table.prototype.length` (en-US) 只读 

返回 Table 的长度，即元素数。

### 实例方法

`Table.prototype.get()` (en-US)

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

`Table.prototype.grow()` (en-US)

将 Table 实例的大小增加指定数量的元素。

`Table.prototype.set()` (en-US)

将存储在给定索引中的元素设置为给定值。

示例
--

### 创建一个新的 WebAssembly Table 实例

下面的示例（见 table2.html 源代码和实时版本）创建了一个新的 WebAssembly Table 实例，初始大小为 2 个元素。然后，我们打印出表的长度和两个索引的内容（通过 `Table.prototype.get()` (en-US) 检索），以显示长度为 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"
```


然后，我们创建一个包含 Table 的导入对象：


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


最后，我们使用 `WebAssembly.instantiateStreaming()` 方法加载并实例化一个 Wasm 模块（table2.wasm）。table2.wasm 模块包含两个函数（一个返回 42，另一个返回 83），并将这两个函数分别存储到导入 Table 的 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 创建并访问 Table，但在 Wasm 实例中，同样的 Table 也是可见并可调用的。

规范
--

| Specification |
| --- |
| WebAssembly JavaScript Interface # tables |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* WebAssembly 概述页
* WebAssembly 概念
* 使用 WebAssembly JavaScript API
WebAssembly.Instance
====================

**实验性:** **这是一项实验性技术**  
在将其用于生产之前，请仔细检查浏览器兼容性表格。

**`WebAssembly.Instance`** 对象本身是有状态的，是 WebAssembly.Module 的一个可执行实例。`实例`包含所有的 WebAssembly 导出函数，允许从 JavaScript 调用 WebAssembly 代码。

`WebAssembly.Instance()` 构造函数以同步方式实例化一个`WebAssembly.Module` 对象。然而，通常获取实例的方法是通过异步函数`WebAssembly.instantiate()` .

构造函数
----

**警告：** 由于大型模块的实例化代价极高，开发人员应只在必须同步实例化的时候，才使用`Instance()`；绝大多数情况应该使用异步方法`WebAssembly.instantiate()` .
```

var myInstance = new WebAssembly.Instance(module, importObject);
```

### 参数

*module*

要被实例化的 `WebAssembly.Module` 对象。

*importObject* 可选

一个包含值的对象，导入到新创建的 `实例`, 比如函数或 `WebAssembly.Memory` 对象。There must be one matching property for each declared import of `module` 否则抛出 WebAssembly.LinkError (en-US) 异常。

实例化
---

所有的 `Instance` 实例继承自`Instance()` 属性对象 (en-US)— 修改它会影响所有的`Instance` 实例。

### 实例属性

`Instance.prototype.exports` (en-US)

返回一个包含此 WebAssembly 模块实例所导出的全部成员的 JS 对象，以便 JavaScript 访问和使用这些成员，这个对象是只读的。

规格
--

| Specification |
| --- |
| WebAssembly JavaScript Interface # instances |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参考
--

* WebAssembly overview page
* WebAssembly concepts
* Using the WebAssembly JavaScript API
WebAssembly.compile()
=====================

**实验性:** **这是一项实验性技术**  
在将其用于生产之前，请仔细检查浏览器兼容性表格。

**`WebAssembly.compile()`** 方法编译 WebAssembly 二进制代码到一个`WebAssembly.Module` 对象。如果在实例化之前有必要去编译一个模块，那么这个方法是有用的（否则，将会使用`WebAssembly.instantiate()` 方法）

语法
--
```

Promise<WebAssembly.Module> WebAssembly.compile(bufferSource);
```

### 参数

*bufferSource*

一个包含你想编译的 wasm 模块二进制代码的 typed array(类型数组) or ArrayBuffer(数组缓冲区)

### 返回值

一个解析为 `WebAssembly.Module` 的`Promise` 对象。

### 异常

* 如果 `bufferSource` 不是一个 typed array, 将抛出一个 `TypeError` 。
* 如果编译失败 promise 将会 reject 一个 `WebAssembly.CompileError`。
示例
--

下面的例子 (查看 GitHub 上的 index-compile.html 例子，并且也能 查看运行效果) 使用 `compile()` 方法编译加载进来的 simple.wasm 二进制代码并且使用 postMessage() 发送给一个 worker。


```js
var worker = new Worker("wasm\_worker.js");

fetch("simple.wasm")
  .then((response) => response.arrayBuffer())
  .then((bytes) => WebAssembly.compile(bytes))
  .then((mod) => worker.postMessage(mod));
```


在线程中 (查看 `wasm_worker.js`) 我们定义了一个导入对象共模块使用，然后设置了一个事件处理函数来接收主线程发送过来的模块。当模块被接收之后，我们使用`WebAssembly.Instantiate()` 方法创建了一个实例，调用从它里面导出的一个方法，接下来展示了我们可以用 `WebAssembly.Module.exports` (en-US) 属性来调用模块上返回的可用信息。


```js
var importObject = {
  imports: {
    imported\_func: function (arg) {
      console.log(arg);
    },
  },
};

onmessage = function (e) {
  console.log("module received from main thread");
  var mod = e.data;

  WebAssembly.instantiate(mod, importObject).then(function (instance) {
    instance.exports.exported\_func();
  });

  var exports = WebAssembly.Module.exports(mod);
  console.log(exports[0]);
};
```

Specifications
--------------

| Specification |
| --- |
| WebAssembly JavaScript Interface # dom-webassembly-compile |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* WebAssembly overview page
* WebAssembly concepts
* Using the WebAssembly JavaScript API
WebAssembly.instantiateStreaming()
==================================

**`WebAssembly.instantiateStreaming()`** 函数直接从流式底层源编译并实例化 WebAssembly 模块。这是加载 Wasm 代码的最有效、最优化的方式。

**备注：** 具有严格的内容安全策略（CSP）的网页可能会阻止 WebAssembly 模块的编译和执行。请参阅 script-src CSP (en-US) 以了解更多有关允许 WebAssembly 编译和执行的信息。

语法
--


```js
WebAssembly.instantiateStreaming(source, importObject)
```

### 参数

`source`

一个 `Response` 对象或一个会兑现为 Response 的 promise，其表示你想要传输、编译和实例化的 Wasm 模块的底层源。

`importObject` 可选

包含一些想要导入到新创建的 `Instance` 中的值的对象，例如函数或 `WebAssembly.Memory` 对象。每个已编译模块的声明导入必须有一个匹配属性，否则抛出 `WebAssembly.LinkError` (en-US) 异常。

### 返回值

一个 `Promise`，会兑现为一个包含两个属性的 `ResultObject`：

* `module`：`WebAssembly.Module` 对象，表示编译完成的 WebAssembly 模块。这个 `Module` 能够再次被实例化或通过 postMessage() 共享。
* `instance`：`WebAssembly.Instance` 对象，包含所有导出的 WebAssembly 方法。
### 异常

* 如果任意参数的类型或结构存在错误，则抛出 `TypeError`。
* 如果操作失败，Promise 根据失败原因以 `WebAssembly.CompileError`、`WebAssembly.LinkError` (en-US) 或
 `WebAssembly.RuntimeError` 拒绝。
示例
--

下面的示例（在 GitHub 上查看 instantiate-streaming.html 示例，也可在线查看）直接从基础源传输一个 Wasm 模块，然后进行编译和实例化，Promise 会兑现 `ResultObject`。因为 `instantiateStreaming()` 函数接受兑现后返回 `Response` 对象的 Promise，你可以直接传递一个 `fetch()` 调用，它会在兑现后将 response 传递给该函数。


```js
const importObject = { imports: { imported\_func: (arg) => console.log(arg) } };

WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
  (obj) => obj.instance.exports.exported\_func(),
);
```


然后访问 `ResultObject` 的实例成员，并调用包含的导出函数。

**备注：** 为了使其工作，服务器应该返回一个 `application/wasm` MIME 类型的 `.wasm` 文件。

规范
--

| Specification |
| --- |
| WebAssembly Web API # dom-webassembly-instantiatestreaming |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* WebAssembly 概述页
* WebAssembly 概念
* 使用 WebAssembly JavaScript API
WebAssembly.RuntimeError()
==========================

\*\*`WebAssembly.RuntimeError()`\*\*构造函数创建一个新的 WebAssembly RuntimeError 对象 --- 一个每当 WebAssembly 陷入指定陷阱时将抛出的类型。

语法
--
```

new WebAssembly.RuntimeError(message, fileName, lineNumber)
```

### 参数

`message` 可选

有可读性的错误信息。

`fileName` 可选
非标准

包含导致异常的代码的文件名。

`lineNumber` 可选
非标准

导致异常的代码的行号。

属性
--

*`RuntimeError`构造函数不包含其自身特有的属性，但是，它确实通过原型链继承了某些属性。*

`WebAssembly.RuntimeError.prototype.constructor`

创建示例原型的特定函数。

`WebAssembly.RuntimeError.prototype.message`

错误信息。尽管 ECMA-262 指定 `URIError` 应提供自己的 `message` 属性，但在 SpiderMonkey 中，它继承了 `Error.prototype.message`。

`WebAssembly.RuntimeError.prototype.name`

错误名称。继承自 `Error`.

`WebAssembly.RuntimeError.prototype.fileName`

报出错误的文件路径。继承自 `Error`.

`WebAssembly.RuntimeError.prototype.lineNumber`

报出错误的代码所在文件中的行数。继承自`Error`.

`WebAssembly.RuntimeError.prototype.columnNumber`

报出错误的代码所在文件中的列数。继承自 `Error`.

`WebAssembly.RuntimeError.prototype.stack`

堆栈跟踪。继承自 `Error`.

方法
--

*`RuntimeError`构造函数不包含自己的方法，但是，它确实通过原型链继承了一些方法。*

`WebAssembly.RuntimeError.prototype.toSource()`

返回可能导致相同错误的代码。继承自`Error`.

`WebAssembly.RuntimeError.prototype.toString()`

返回表示代表指定的`Error`对象的字符串。从`Error`.

样例
--

以下代码段创建了一个新的 RuntimeError 实例，并将其详细信息记录到控制台：


```js
try {
  throw new WebAssembly.RuntimeError("Hello", "someFile", 10);
} catch (e) {
  console.log(e instanceof RuntimeError); // true
  console.log(e.message); // "Hello"
  console.log(e.name); // "RuntimeError"
  console.log(e.fileName); // "someFile"
  console.log(e.lineNumber); // 10
  console.log(e.columnNumber); // 0
  console.log(e.stack); // 返回代码运行的位置
}
```

规范
--

| Specification |
| --- |
| WebAssembly JavaScript Interface # exceptiondef-runtimeerror |
| ECMAScript Language Specification # sec-native-error-types-used-in-this-standard |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* WebAssembly overview page
* WebAssembly concepts
* Using the WebAssembly JavaScript API
WebAssembly.validate()
======================

**`WebAssembly.validate()`** 方法用于验证包含 WebAssembly 二进制码的一个 typed array 是否合法，返回 `true` 如果这些字节能构成一个合法的 wasm 模块，否则返回 `false`。

语法
--
```

WebAssembly.validate(bufferSource);
```

### 参数

`bufferSource`

一个包含 WebAssembly 二进制码的 typed array 或 ArrayBuffer。

### 返回值

一个布尔值，用来表示给定的 `bufferSource` 是合法 wasm 代码（`true`）或者不是（`false`）。

### 异常

如果给定的 `bufferSource` 不是 typed array 或 ArrayBuffer 类型，将会抛出 `TypeError` 异常。

示例
--

下面的例子（查看 validate.html 源代码，或者在线预览）通过 `fetch` 获取了一个 .wasm 模块并将其转换为一个 typed array。接下来用 `validate()` 方法来验证这个模块是否合法。


```js
fetch("simple.wasm")
  .then((response) => response.arrayBuffer())
  .then(function (bytes) {
    var valid = WebAssembly.validate(bytes);
    console.log(
      "The given bytes are " + (valid ? "" : "not ") + "a valid wasm module",
    );
  });
```

规范
--

| Specification |
| --- |
| WebAssembly JavaScript Interface # dom-webassembly-validate |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* WebAssembly overview page
* WebAssembly concepts
* Using the WebAssembly JavaScript API
开源 Web 技术示例
===========

Mozilla 支持各种令人兴奋的开源 Web 技术，我们鼓励大家使用它们。此页面提供了有关这些技术的一些有趣演示链接。

如果你知道开源 Web 技术的优秀演示或者应用，就在这里（以及 英文页面）添加一个合适的链接吧。

2D 图形
-----

### Canvas

* Blob Sallad: an interactive blob using JavaScript and canvas（示例）
* Flying through space
* 3D RayCaster
* processing.js
* 3D on 2D Canvas
* miniPaint: Image editor（源码）
* Zen Photon Garden（源码）
### SVG

* Bubblemenu （视觉特效与交互）
* HTML transformations（使用了 `<foreignObject>` 元素）（视觉特效与变换）
* Phonetics Guide（可交互）
* 3D objects demo（可交互）
* Blobular（可交互）
* Video embedded in SVG（或下载到本地）
* Summer HTML image map creator（源码）
### 视频

* Video 3D Animation "mozilla constantly evolving"
* Video 3D animation "Floating Dance"
* Streaming Anime, Movie Trailer and Interview
* Billy's Browser Firefox Flick
* Virtual Barber Shop
* Transformers Movie Trailer
* A Scanner Darkly Movie Trailer（自带控制功能）
* Events firing and volume control
* Dragable and sizable videos
3D 图像
-----

### WebGL

* Web Audio Fireworks
* IoQuake3（源码）
* Escher puzzle（源码）
* Kai 'Opua（源码）
### 虚拟现实（VR）

* The Polar Sea（源码）
* Sechelt fly-through（源码）
CSS
---

* CSS Zen Garden
* CSS floating logo "mozilla"
* Paperfold
* CSS Blockout
* Rubik's cube
* Pure CSS Slides
* Planetarium（源码）
* Loader with blend modes
* Text reveal with clip-path
* Ambient shadow with custom properties
* Luminiscent vial

旧项目：

* CSS floating logo "Mozilla" developed by Rober Villar, from Software RVG. (debug 模式)
* Bootstrap Contact Form Design
* CSS Paralax Forest
* Responsive Login Page Design
* One Page Scroll Website Template
### 变换

* Impress.js (源码)
游戏
--

* IoQuake3（源码）
* Kai 'Opua（源码）
Web API
-------

### 通知 API

* HTML5 Notifications（源码）
### 网络音频 API

* Web Audio Fireworks
* oscope.js - JavaScript oscilloscope
* HTML5 Web Audio Showcase（源码）
* HTML5 Audio Visualizer（源码）
* Graphical Filter Editor and Visualizer（源码）
### 文件 API

* Slide My Text - presentation from plain text files
### 其他

* Web Worker Fractals
* Photo editor
* Coral generator
* Raytracer
* HotCold Touch Typing