1、什么是事件?
发生在编程系统中的事情。
例如:
- 用户选择、点击或将光标悬停在某一元素上。
- 用户在键盘中按下某个按键。
- 用户调整浏览器窗口的大小或者关闭浏览器窗口。
- 网页结束加载。
- 表单提交。
- 视频播放、暂停或结束。
- 发生错误。
事件处理器/事件监听器
为了对一个事件做出反应,你要给它附加一个事件处理器/时间监听器
。这是一个代码块(通常是你作为程序员创建的一个 JavaScript 函数)。
2、任务(Tasks)
从头执行一段程序、执行一个事件回调或一个 interval/timeout 被触发之类的标准机制而被调度的任意 JavaScript 代码。即事件是任务的其中一项。
任务被添加到任务队列
的时机:
- 一段新程序或子程序被直接执行时(比如从一个控制台,或在一个
<script>
元素中运行代码)。 - 触发了一个事件,将其回调函数(事件处理器/事件监听器)添加到任务队列时。
setTimeout()
或setInterval()
创建的定时回调,相应的回调函数被添加到任务队列时。
4、事件循环
- 1、收集任务,添加到任务队列;
- 2、对任务队列进行排队;
- 3、执行队列中等待的任务;
- 4、执行清空微任务队列;
- 5、开始下一次循环之前执行一些必要的渲染和绘制操作;
- 6、开始下一次循环(开始步骤1)
5、运行时和上下文
- JavaScript 运行时
在执行 JavaScript 代码的时候,JavaScript 运行时
是维护一组用于执行 JavaScript 代码的代理
(一组执行上下文的集合、执行上下文栈、主线程、一组可能创建用于执行 worker 的额外的线程集合、一个任务队列以及一个微任务队列构成一个代理
)。
- JavaScript 执行上下文
当一段 JavaScript 代码在运行的时候,它实际上是运行在执行上下文中。下面 3 种类型的代码会创建一个新的执行上下文:
1、 全局上下文是为运行代码主体而创建的执行上下文,也就是说,它是为那些存在于 JavaScript 函数之外的任何代码而创建的。
2、 每个函数会在执行的时候创建自己的执行上下文。这个上下文就是通常说的“本地上下文”。 3、 使用
eval()
函数也会创建一个新的执行上下文。