我知道JS是单线程的,并且同步执行。因此,当我添加一个文件到浏览器头部标签时,该文件会在遇到它时立即执行。然后它会去下一个脚本标签并执行那个文件。我的问题是,当我动态地将一个js文件添加到HTML头部标签中时,浏览器如何执行该文件?
它是否像加载文件时一样立即执行文件,无论当前执行位置在哪里。或者我们可以控制该文件的执行方式吗?
我知道JS是单线程的,并且同步执行。因此,当我添加一个文件到浏览器头部标签时,该文件会在遇到它时立即执行。然后它会去下一个脚本标签并执行那个文件。我的问题是,当我动态地将一个js文件添加到HTML头部标签中时,浏览器如何执行该文件?
它是否像加载文件时一样立即执行文件,无论当前执行位置在哪里。或者我们可以控制该文件的执行方式吗?
doSomething()
或(function(){...})()
,则代码将被执行(当然必须有定义);脚本加载后,将尽快执行。也就是说,如果其他JavaScript函数正在执行(如clickhandler或其他),该函数将被允许先完成 - 但这是可以预见的,因为在浏览器中JavaScript通常在单个线程中执行。
您无法控制脚本加载的部分,但可以使用此模式-受JSONP的启发:
插入脚本:
(function () {
var module = {
init: function () {
/* ... */
}
}
ready(module); // hook into "parent script"
}());
主页面上的脚本:
function ready(o) {
// call init in loaded whenever you are ready for it...
setTimeout(function () { o.init(); }, 1000);
}
这里关键是您页面上定义的 ready
函数,并在您动态插入的脚本中调用。脚本不会立即开始执行,而是只会告诉父页面它已加载完成,然后父页面可以随时回调插入脚本的 init
函数以启动执行。
resultReady
的全局方法,然后在由displayResult()
插入的脚本底部调用resultReady
函数。 - AHM考虑一种实现方法:
var js=document.createElement('script')
js.setAttribute("type","text/javascript")
js.setAttribute("src", filename)
document.getElementsByTagName("head")[0].appendChild(js);
// ^ However this technique has been pointed to be not so trusworthy (Read the link in the comment by Pomeh)
回答你的问题:
浏览器如何执行该文件?
脚本一旦添加到DOM中,就会立即执行。
是不是文件在加载时无论当前执行位置在哪里都会被执行?
是的。
还是说我们可以控制文件的执行方式?
最好是附加一个onload事件处理程序,而不是使用恶意技巧。
这里有一些代码,你可以尝试用它来得到你的问题的答案。
<script>
var s = document.createElement('script'), f = 1;
s.src="http://code.jquery.com/jquery-1.7.2.js";
document.head.appendChild(s)
s.onload = function(){
console.log(2);
f = 0
}
while(f){
console.log(1);
}
</script>
console
和network
面板中记录一些调试信息并查看发生了什么。 - pomeh