--- title: asm.js的异步脚本 slug: Games/Techniques/Async_scripts translation_of: Games/Techniques/Async_scripts ---
{{GamesSidebar}}
{{IncludeSubnav("/zh-CN/docs/Games")}}

每个中型或大型游戏都应编译asm.js代码作为异步脚本的一部分,以便浏览器能够最大限度地灵活地优化编译过程。 在Gecko中,异步编译允许JavaScript引擎在游戏加载时缓存主线程的asm.js,并缓存生成的机器代码,这样游戏就不需要在随后的加载中编译(从Firefox 28开始)。 要查看差异,请切换javascript.options.parallel_parsing in about:config.

异步执行

获取异步编译非常简单:编写JavaScript时,只需使用async属性即可:

<script async src="file.js"></script>

或者,通过脚本来做同样的事情:

var script = document.createElement('script');
script.src = "file.js";
document.body.appendChild(script);

(从脚本中创建的脚本默认为异步。) 默认的HTML shell Emscripten生成后者。

什么时候用async或者不用?

两种常见的情况下是脚本是异步的(由HTML规范定义)

<script async>code</script>

以及

var script = document.createElement('script');
script.innerHTML = "code";
document.body.appendChild(script);

两者都被视为“内联”脚本,阻塞其余所有任务,进行编译,编译完成后立即执行。

如果你的代码是一个JS字符串呢? 而不是使用eval或innerHTML,这两者都会触发同步编译,您应该使用Blob和URL对象:

var blob = new Blob([codeString]);
var script = document.createElement('script');
var url = URL.createObjectURL(blob);
script.onload = script.onerror = function() { URL.revokeObjectURL(url); };
script.src = url;
document.body.appendChild(script);

使用src而不是innerHTML,则该脚本是异步的。