我们知道打开一个网页的时候,浏览器会首先创建一个窗口,这个窗口就是一个window对象,也是javascript运行所依附的全局环境对象和全局作用域对象。
为了加载网页文档,当期的窗口将为要打开的网页创建一个document对象,然后将页面加载到这个document中,网页的内容就是在这这个过程中一边加载一边显示出来,javascript也是伴随着这个过程,一边加载一边执行的。
进行加载和执行的目的,就是建立文档对象模型(DOM)主框架,这个文档框架是由当前文档窗口的主线程来执行,并依照严格的顺序执行。
浏览器中会有多少线程可以同时加载网页内容呢。Web标准有一个限制就是对同一个域名最多只允许两个连接来读取内容,大多浏览器都遵循这一标准。
对于外部js文件的加载,有一种所谓的异步加载js文件技术。其基本原理就是在当前 被加载执行的js代码中,想document对象动态的一次添加对个<script>标签来引入要加载的多个js文件。这时浏览器在解析和处理动态添加的标签时,将开启相应的线程和连接去加载这些外部的js文件,这只是实现了异步加载,而非js代码实现异步执行,(不同浏览器对这种动态引入的技术执行顺序是不同的)。
当页面的主框架加载和执行完毕,浏览器才开始执行和=触发window对象或body对象的onload事件,在极少数的情况下网页如果么有body对象,浏览器在网页记载完毕之后自动创建一个body对象,并将设置成document的body属性。
由于一个浏览器在打开多个网页的时候,所有的javascript占用都是同一个线程,我们在给网页编写脚本时,就不能太自私的编写大量耗时的代码。你得考虑用户在打开页面的同时也有可能浏览其他页面。