如何理解延迟脚本和异步脚本

延迟脚本

HTML 4.01 为 <script> 标签定义了 defer 属性。这个属性的用途是表明脚本在执行时不会影响页
面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。因此,在 <script> 元素中设置
defer 属性,相当于告诉浏览器立即下载, 但延迟执行。
<!DOCTYPE html>
<html>
<head>
<title>Example HTML Page</title>
<script type="text/javascript" defer="defer" src="example1.js"></script>
<script type="text/javascript" defer="defer" src="example2.js"></script>
</head>
<body>
<!-- 这里放内容 -->
</body>
</html>
在这个例子中,虽然我们把 <script> 元素放在了文档的 <head> 元素中,但其中包含的脚本将延迟到浏览器遇到 </html> 标签后再执行。HTML5 规范要求脚本按照它们出现的先后顺序执行,因此第一个延迟脚本会先于第二个延迟脚本执行,而这两个脚本会先于 DOMContentLoaded 事件执行。在现实当中,延迟脚本并不一定会按照顺序执行,也不一定会在 DOMContentLoaded 事件触发前执行,因此最好只包含一个延迟脚本。
当然,还有一点,defer 属性只适用于外部脚本文件。
IE4、Firefox 3.5、Safari 5 和 Chrome 是最早支持 defer 属性的浏览器。其他浏览器会忽略这个属 性,像平常一样处理脚本。为此,把延迟脚本放在页面底部仍然是最佳选择。

异步脚本

HTML5 为 <script> 元素定义了 async 属性。这个属性与 defer 属性类似,都用于改变处理脚本的行为。同样与 defer 类似, async 只适用于外部脚本文件,并告诉浏览器立即下载文件。但与 defer不同的是,标记为 async 的脚本并不保证按照指定它们的先后顺序执行。例如:

<!DOCTYPE html>
<html>
<head>
<title>Example HTML Page</title>
<script type="text/javascript" async src="example1.js"></script>
<script type="text/javascript" async src="example2.js"></script>
</head>
<body>
<!-- 这里放内容 -->
</body>
</html>
在以上代码中,第二个脚本文件可能会在第一个脚本文件之前执行。因此,确保两者之间互不依赖非常重要。指定 async 属性的目的是不让页面等待两个脚本下载和执行,从而异步加载页面其他内容。为此,建议异步脚本不要在加载期间修改 DOM。
异步脚本一定会在页面的 load 事件前执行,但可能会在 DOMContentLoaded 事件触发之前或之后执行。支持异步脚本的浏览器有 Firefox 3.6、Safari 5 和 Chrome。

以上内容参考自《JavaScript高级程序设计》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到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、付费专栏及课程。

余额充值