###函数防抖与节流
前言:下列场景往往由于事件频繁被触发,因而频繁执行DOM操作、资源加载等重行为,导致UI停顿甚至浏览器崩溃:
- window对象的resize、scroll事件
- 拖拽时的mousemove事件
- 射击游戏中的mousedown、keydown事件
- 文字输入、自动完成的keyup事件
- 节流throttle。如果是第一次调用该函数,那么会马上调用func,否则就会记录当前时刻,当第二次调用的时间间隔超过wait时,才调用func。
- 防抖debounce。当调用动作n毫秒后才会执行该动作,如果在这n毫秒内又调用此动作则将重新计算执行时间。
事件循环机制
js是一个单线程的非阻塞脚本语言。单线程:js代码在执行的任何时候,都只有一个主线程来处理所有任务;非阻塞:当代码需要进行一项异步任务时,主线程会挂起pending这个任务,然后在异步任务返回结果时再根据一定规则去执行相应的回调。
同步代码:当一些列方法被依次调用的时候,因为Js是单线程的,同一时间只能执行一个方法,于是这些方法被排队在一个单独的地方,这个地方叫执行栈。 当一个脚本第一次执行的时候,js引擎会解析这段代码,并将其中的同步代码按照执行顺序加入执行栈中,然后从头开始执行。如果当前执行的是一个方法,那么js会向执行栈中添加这个方法的执行环境,然后进入这个执行环境继续执行其中的代码。当这个执行环境中的代码 执行完毕并返回结果后,js会退出这个执行环境并把这个执行环境销毁,回到上一个方法的执行环境。。这个过程反复进行,直到执行栈中的代码全部执行完毕。
执行栈是同步代码执行时执行上下文存在的空间。事件队列是异步