假设有两个JavaScript文件。
one.js
window.a=1;two.js
window.a=2;和加载程序: loader.html
<body></body>
<script>
const s1=document.createElement("script");
s1.src="one.js";
s1.addEventListener("load",()=>console.log("one.js",window.a));
const s2=document.createElement("script");
s2.src="two.js";
s2.addEventListener("load",()=>console.log("two.js",window.a));
document.body.appendChild(s1);
document.body.appendChild(s2);
</script>它总是以1或2的形式产生吗?(编辑:它的意思不是“我想要的代码,总是产生-1”或“我想要的代码,总是产生-2”。1和2都可以接受.)
出局-1
"one.js" 1
"two.js" 2出局-2
"two.js" 2
"one.js" 1我担心的是浏览器是否会按照s1-exec -> s2-exec -> s1-onload -> s2-onload并产生Out-3的顺序运行。
出局-3
"one.js" 2
"two.js" 2我检查了HTML5规范https://www.w3.org/TR/2008/WD-html5-20080610/tabular.html#script
蚂蚁上面写着:
如果负载成功
它是否保证“其他脚本标记不会中断步骤1和步骤2之间的进程”?
(编辑)换句话说,我想知道HTML规范是否要求浏览器通过step1通过step2同步运行(标题“立即”意味着这一点)。
发布于 2019-02-06 03:08:59
至少根据规范,可以保证load事件在“执行脚本块”算法的末尾触发。
所以,你可以面对-1和2,但不是出局-3。
当您在文档中追加元素时,它将作为async脚本加载。这意味着无法保证脚本-1和脚本-2之间的执行顺序。
// scr1 will load an external script
const scr1 = document.createElement('script');
scr1.onload = e => console.log('1', window.$);
scr1.src = 'https://cdn.jsdelivr.net/gh/jquery/jquery@3.2/dist/jquery.js?' + Math.random();
// scr2 will load a dataURL script
const scr2 = document.createElement('script');
scr2.onload = e => console.log('2', window.$);
scr2.src = 'data:application/javascript,$="script 2"';
// even though scr1 is appended first
document.head.appendChild(scr1);
document.head.appendChild(scr2);
但是,当他们在执行脚本块算法的末尾请求火事件时,没有任何竞争条件,事件的回调将被同步执行。
(注意:如果他们要求"使任务排队 to 引发事件",就像在其他地方一样,那么回调就会异步启动,但仍然没有竞争条件,因为两个任务都会在同一个任务队列中排队)。
https://stackoverflow.com/questions/54545576
复制相似问题