异步脚本

一个包含外部样式表文件和一个脚本文件的HTML载入和渲染过程:

1.浏览器下载HTML文件并开始解析DOM;

2.遇到外部样式表文件时,将其加入资源文件下载队列,继续解析DOM;

3.遇到脚本文件时,暂停DOM解析,立即下载脚本文件;

4.下载结束后立即执行脚本,在脚本中可访问当前<script>以上的DOM;

5,脚本执行完成后,继续解析DOM;

6,整个DOM解析完成后,触发DOMcontentload事件。

浏览器的在遇到defer和async属性的<script>的浏览器执行过程如下(以下摘自JavaScript权威指南):

  1. WEB浏览器创建Document对象,并且开始解析WEB页面,解析HTML元素和它们的文本内容后添加Element对象和Text节点到文档中。这个过程的readystate的属性值是“loading”
  2. 当HTML解析器遇到没有async和defer属性的<script>时,它把这些元素添加到文档中,然后执行行内或外部脚本。这些脚本会同步执行,并且在脚本下载(如果需要)和执行解析器会暂停。这样脚本就可以用document.write()来把文本插入到输入流中。解析器恢复时这些文本会成为文档的一部分。同步脚本经常单定义函数和注册后面使用的注册事件处理程序,但它们可以遍历和操作文档树,因为在它们执行时已经存在了。这样同步脚本可以看到他自己的<script>元素和它们之前的文档内容
  3. 当解析器遇到了设置async属性的<script>元素时,它开始下载脚本,并继续解析文档。脚本会在它下载完成后尽快执行,但是解析器没有停下来等他下载。异步脚本禁止document.write()方法。它们可以看到自己的<script>元素和它之前的所有文档元素,并且可能或干脆不可能访问其他的文档内容。
  4. 当文档完成解析,document.readyState属性变成“interactive”。
  5. 所有有defer属性的脚本,会被它们在文档的里的出现顺序执行。异步脚本可能也会在这个时间执行。延迟脚本能访问完整的文档树,禁止使用document.write()方法。
  6. 浏览器在Document对象上触发DOMContentLoaded事件。这标志着程序执行从同步脚本执行阶段转到异步事件驱动阶段。但要注意,这时可能还有异步脚本没有执行完成。
  7. 这时,文档已经完全解析完成,但是浏览器可能还在等待其他内容载入,如图片。当所有这些内容完成载入时,并且所有异步脚本完成载入和执行,document.readyState属性变为“complete”,WEB浏览器出发Window对象上的load事件。
  8. 从此刻起,会调用异步事件,以异步响应用户输入事件,网络事件,计算器过期等。


当涉及到Lua的异步编程,通常使用协程(coroutine)来实现。下面是一个简单的示例,展示了如何使用Lua的协程来实现异步脚本: ```lua -- 创建一个异步函数 local function asyncTask(callback) -- 模拟异步操作,比如网络请求或者文件读取 -- 这里使用定时器模拟延迟 local function simulateAsyncOperation() print("开始异步操作...") -- 模拟异步操作延迟2秒 local delay = 2 os.execute("sleep " .. delay) print("异步操作完成!") -- 执行回调 callback() end -- 创建协程 local co = coroutine.create(simulateAsyncOperation) -- 启动协程 coroutine.resume(co) end -- 异步任务完成后的回调函数 local function callback() print("执行回调函数") end -- 执行异步任务 asyncTask(callback) print("主线程继续执行...") ``` 在这个示例中,我们定义了一个名为`asyncTask`的异步函数,该函数接受一个回调函数作为参数。在`asyncTask`内部,我们使用了一个定时器模拟了一个异步操作,然后通过在协程中运行该操作来实现异步性。 在主线程中,我们创建了一个回调函数`callback`,它将在异步任务完成后被调用。然后,我们调用`asyncTask`函数来执行异步任务。注意,异步任务的执行并不会阻塞主线程的执行,所以在异步任务执行期间,主线程可以继续执行其他操作。 这个示例只是一个简单的示范,实际的异步编程可能会涉及更复杂的逻辑和处理。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值