1.官方说法:函数中的函数,至少包含两个函数,他们是嵌套关系
2.个人理解:1.需要一个不被销毁的函数空间。2.需要直接或间接返回一个函数。3.函数内部需要访问外部函数的私有变量。即内部函数可以称为外部函数的闭包。
3.应用场景:
- 函数柯理化
- 防抖
- 节流
- 模块化开发
4. 函数柯理化
原理:一个多参数的函数转化为一系列单参数函数
例子:
add(a,b,c,d) {
return a + b + c + d;
},
keLi(fn,...arg){
let length = fn.length
let args = arg || []
return function(...args1) {
args =[...args,...args1]
if(args.length === length){
return fn(...args)
}else{
return this.keLi(fn,...args)
}
}
},
调用(如果传参数量不够时返回为函数)
let num = this.keLi(this.add,'2','33','44')('5')
console.log(num); //233445
5.防抖
为了防止请求特别频繁 执行最后一次
//获取元素
const btn = document.querySelector('button')
// 定义一个变量用来表示我们的定时器
let t = null
// 给按钮添加点击事件
btn.onclick = function (){
// 首先进来以后要做的就是关闭定时器
clearTimeout(t)
// 开启一个定时器
t = setTimeout(function () {
console.log(111);
},1000)
}
6.节流
=> 指的就是在一定的时间内执行一次
=> 也是用来降低你的频率(次数)
=> 只允许你执行一次
// 获取元素
const btn = document.querySelector('button')
// 定义一个开关
let flag = true
// 添加点击事件
btn.onclick = function () {
// 首先要做的就是判断开关的一个状态
if (flag) {
// 就是关闭我们的开关
flag = false
console.log(111);
}
// 多长时间以后在让你执行 , 需要开启开关
setTimeout(function () {
// 这里我们需要开启开关
flag = true
},1000)
}
7.防抖和节流的区别
特性 | 防抖(debounce) | 节流(throttle) |
---|---|---|
执行时机 | 最后一次触发后延迟执行 | 固定间隔执行 |
触发频率 | 不固定,取决于用户操作间隔 | 固定频率 |
适用场景 | 搜索建议、窗口resize、输入验证 | 滚动事件、鼠标移动、动画处理 |
目标 | 确保只执行最后一次操作的处理 | 确保操作以合理频率执行 |
结果 | 只在用户停止操作后执行一次 | 在操作过程中均匀执行多次 |