【发布时间】:2020-03-13 21:01:33
【问题描述】:
我想在页脚 html 部分插入 2 个脚本,但我的行为很奇怪。如果我在 html 本身中使用标签手动插入,它可以工作(index1.html)。但是,如果我使用 IIFE 创建标签并将它们插入相同的位置和相同的顺序 (index2.html),控制台中会显示一个错误,告诉“未定义虚拟变量”。常识告诉我错误是可以的(因为dummy是在使用后定义的),但是为什么它适用于index1.html?
index1.html:
...
<script src="script1.js" async></script>
<script src="script2.js"></script>
</body>
</html>
index2.html:
...
<script>
(function(){
var loadScript = function(data, callback) {
var script = document.createElement('script');
script.src = data.src;
if (data.opts) {
if (data.opts.async) script.async = data.opts.async;
}
document.body.appendChild(script);
}
var loadScriptRecursive = function(scripts, index) {
loadScript(scripts[index], function () {
if (++index < scripts.length) loadScriptRecursive(scripts, index);
});
}
var scripts = [{src: 'script1.js'}, {src: 'script2.js', opts: {async: false}}];
loadScriptRecursive(scripts, 0);
})()
</script>
</body>
</html>
script1.js:
$(document).ready(function () {
if (dummy) ...
...
}
script2.js:
var dummy = true
【问题讨论】:
-
会不会,因为第一个脚本是异步的?
-
我已经读到使用 document.createElement('script') 插入默认是异步的,这就是为什么我将 async=false 设置为第二个
-
是的,你给自己一个竞争条件。
-
检查一下:javascript.info/script-async-defer 说“动态脚本默认表现为‘异步’。”
-
是的,我的意思是,当无法保证脚本的顺序时,您不应该期望脚本的顺序很重要。你需要重写你的代码,所以这个顺序无关紧要。
标签: javascript html iife