赞 | 65 |
VIP | 231 |
好人卡 | 2 |
积分 | 19 |
经验 | 35171 |
最后登录 | 2024-9-15 |
在线时间 | 1554 小时 |
Lv3.寻梦者
- 梦石
- 0
- 星屑
- 1912
- 在线时间
- 1554 小时
- 注册时间
- 2013-4-13
- 帖子
- 917
|
本帖最后由 沉滞的剑 于 2019-8-23 18:24 编辑
1.
js是单线程的, 但是js引擎支持异步
也就是说可以让一部分代码过一阵子再执行
异步和并行不一样, 异步采取的是队列方式来执行代码
当异步任务完成了, 由浏览器通知引擎, 引擎将回调代码放入任务队列
如果当前任务队列中还有代码在执行, 那么新的回调代码将排队等着
其他异步任务完成后也会加入这个队列
当当前的代码执行完毕了, 如果队列不为空则执行最先进入队列的代码
回调代码保证在当前代码之后执行
但是不保证和其他回调代码的执行顺序
2.
setTimeout就是一个异步操作, 它并不是js标准的一部分
它在被执行后调用的是native的代码, 也就是浏览器的接口api
你的回调函数应该会被正常执行
你可以贴一下你的代码看看
不过由于js是单线程的, 所以不会有一个代码执行一半切换到其他代码的情况
它们会老老实实按照队列顺序执行
有一个类似可以实现多线程的技术叫做协程
它并不能像真正多线程一样做到指令级别的切换
它的本质只是把回调代码切的更细了而已,
因为异步操作不保证顺序,
所以不同任务的不同回调函数会夹杂在一起挤入队列
给人一种并行的错觉
3.
rm的事件也不是同步执行的
而是每一帧更新所有对象的状态
举个例子,
假如舞台上有两个球正在运动
你在每一秒的时候计算一下每个球的位置
你只能一个一个球画下来, 但是这段时间世界是静止的
然后每次你再把这个画面展示给别人看
人是看不出你先画了哪一个, 后画了哪一个的
只是觉得两个球同时在动而已
===================
4. 补充
上面这个一帧的概念是由另外一个浏览器接口API提供的
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestAnimationFrame
你可以看成是间隔为屏幕刷新率的setTimeOut |
|