闭包
- 闭包就是能够读取其他函数内部变量的函数
- 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域
- 闭包的特性:
- 函数内再嵌套函数
- 内部函数可以引用外层的参数和变量
- 参数和变量不会被垃圾回收机制回收
- 好处:能够实现封装和缓存等;
- 坏处:就是消耗内存、不正当使用会造成内存溢出的问题
防抖
事件触发后,等待一段时间(delay
),如果在这段时间内再次触发事件,则重新计时。应用场景:表单输入校验、按钮防重复点击、搜索框输入。
- 分析:
arguments
是 JavaScript 函数内的一个类数组对象,包含调用该函数时传入的所有参数。用于捕获防抖函数调用时传递的参数,并将它们传递给原始的目标函数fn
。fn.apply(this, args)fn
是目标函数,即防抖封装的函数。apply
是 JavaScript 中用于调用函数的方法之一,允许动态指定函数执行时的上下文(this
)和参数。apply
的第一个参数是要绑定的上下文(这里是this
),第二个参数是参数数组。timer
是闭包变量,用于在多次调用之间共享状态(即存储定时器) - 具体流程
- 第一次触发,启动定时器。
- 如果在
delay
时间内再次触发,清除之前的定时器,重新计时。 - 当触发停止超过
delay
时间时,执行函数。
节流
事件触发后,在一定时间间隔内(delay
),只允许执行一次,无论事件触发了多少次。应用场景:滚动事件、窗口调整事件。
- 节流 (
throttle
) 流程- 第一次触发,立即启动定时器并执行函数。只要在delay范围内,只执行一次并清空time
- 在
delay
时间内,如果再次触发,直接忽略。 - 定时器完成后,允许下一次触发。