附加到 dom 时的 JavaScript 执行顺序

标签 javascript

所以我发现这个链接很好地解释了如何加载脚本:

http://www.html5rocks.com/en/tutorials/speed/script-loading/

但是我无法理解如果我这样做会发生什么:

<script>
var script = document.createElement("script");   
script.src = "//www.domain.com/script.js";
document.getElementsByTagName("head")[0].appendChild(script);      
</script>

<script>
console.log(myVar);
</script>

script.js 包含例如

var myVar = 'foobar';

所以我的问题是...由于 script.js 附加在单独的脚本标记中,这是否保证 script.js 将在之前加载并执行console.log()

最佳答案

从您链接的网站:

Scripts that are dynamically created and added to the document are async by default, they don’t block rendering and execute as soon as they download, meaning they could come out in the wrong order. (emphasis theirs).

这意味着通过 JavaScript 添加到页面的脚本的执行顺序无法保证(如上面的示例所示)。

如果您希望执行具有确定性,则需要手动禁用 async 属性:

var script = document.createElement("script");  
script.src = "//www.example.com/script.js";
script.async = false; // overwrite the default
document.getElementsByTagName("head")[0].appendChild(script);

关于附加到 dom 时的 JavaScript 执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29858980/

相关文章:

javascript - 删除特定文本和换行符

javascript - 你能用c++加载一个网页,包括JS和动态html并获取渲染的DOM字符串吗?

javascript - 相当于JQuery中Angular Js的编译链接功能

javascript - 如何防止 jquery 删除 &lt;script&gt; 标签

java - 让 Jsoup 支持 JavaScript 动态生成的 html

javascript - 试图在 JavaScript 中获取节点的值,但它一直说它是 "null"

Javascript 原型(prototype)与 $.extend - 内存难题

javascript - 如何汇总 .each 循环的结果?各个 list 卡的 list 板总数

php - 保留像 é 这样的特殊字符

java - 在java中构造json对象并从JSONObject中获取值