一、前言
最近在面试前端的过程中,我喜欢问一些开放性的题目,类似于名词解释,但很宽松,主要就是看看前端应试者对相关方面的理解。
当我提到event.target是什么的时候,应试者似乎还愣了一下,忘了他当时说什么了。总之,我补充道这是事件的触发目标,然后尝试让他说一下Event对象。然后说着说着不知怎么的跑到事件循环去了,或许是事件循环是一个常见的面试题目吧,关于事件本身却是一字未提。
要知道,在前端开发里,JavaScript(后面简称js)举足轻重,而js都是基于事件驱动的,事件自然是js的一大主题。
在前端学习的初级阶段,应该会了解过类似的话:
- “js是采用事件驱动(event-driven)响应用户操作的。比如通过鼠标或者按键在浏览器窗口或者网页元素(按钮,文本框...)上执行的操作,我们称之为事件(Event)。由鼠标或热键引发的一连串程序的动作,称之为事件驱动(Event-Driver)。对事件进行处理程序或函数,我们称之为事件处理程序(Event Handler)。”
如果你是一个前端新手,那么可以看一篇基础的文章:事件介绍——MDN
二、正题
事件就是理解前端发生了什么了的底层逻辑
鼠标移动是一个事件(mousemove),鼠标移入是一个事件(mousein),键盘敲击是一个事件(keydown),页面加载好了是一个事件(DOMContentLoaded)。在前端,任何发生的事情都是一个事件。
在《时间的十层理解》中的某一层中(扯远了),时间即是事件。任何一个微小的时间都可以看作是一个事件,时间便是由一个个的事件组成的。事件驱动的思想或许也起源于此。
事件驱动是如何实现的
一门高级编程语言是如何通过调动操作系统API实现硬件交互这种过于底层的就不提了,让我们来看看浏览器环境中js关于事件的实现:
如果你在控制台输入new EventTarget()就可以得到一个EventTarget对象,点进去可以看到,其原型是Object,也就是最顶层的原型————js中万物皆对象,如果你没有研究过Object对象,那正好还可以顺便学习一下js的基石。
接着在MDN搜索EventTarget词条,就可以看到js是如何处理事件的。本文旨在引导,具体内容就不赘述了。不过有一点需要注意:onclick等这一类on开头的是0级DOM事件,在实际应用中的一定情况下存在限制。依据 DOM 事件模型的发展阶段,现在更推荐使用addEventListener(click)这种2级DOM事件的写法来避免一些潜在的错误。
后端的js环境和浏览器js环境的事件机制有所不同
js是一门脚本语言,而ECMA Scrip是这门语言的规范。语言本身并没有实际能力,它需要在语言环境中才能运行。
浏览器环境下,事件采用的是基于EventTarget对象的事件模型,通过其属性和方法,我们就知道它与浏览器的 DOM 结构和用户交互场景紧密结合,非常适合处理用户界面相关的事件,如鼠标点击、键盘输入、页面加载等。
而在后端环境下(nodejs),则是采用了基于 EventEmitter 的事件驱动架构,这种架构非常适合处理异步 I/O 操作和服务器端的各种事件。EventEmitter提供了一种简单而灵活的方式来实现事件的发布和订阅,使得不同模块之间可以方便地进行通信和协作。例如,在处理 HTTP 请求、文件读取、数据库操作等场景中,EventEmitter可以很好地处理异步事件的触发和响应。
类似的,或许你还了解过webview,里面之所以能运行js语言,也是因为其实现了一套js语言环境,其与浏览器环境相似,但有些许差别。
补充
避免你基础知识的遗漏,你至少还需要知道:
- 事件的捕获、目标、向上冒泡。
- 事件委托。
换句话说,MDN由浅入深前端教程是非常好的,对于你系统的学习前端。(这到底是翻译腔还是AI腔。。。。一定是我代码敲多了。。。。)