闭包的实际运用防抖
防抖:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,
如果设定的时间到来之前,又一次触发了事件,就重新开始 延时。
(如果在一段时间内,又触发了该事件;就重新开始 延时)
主要运用
1==>在用户输入
2==> 用户不断的点击按钮
3==>射击游戏中的mousedown、keydown事件
4==>搜索,结束后n秒后才进行搜索;n秒内,又输入就重新计时
5==>echarts的resize函数的底层就有防抖
节流:在规定时间内,保证执行一次该函数。
将函数调用赋值给变量;此时函数已经执行了一次哈
你认为test函数有没有被执行
<script>
function test() {
console.log('我是被执行了一次的');
}
let aa = test();
</script>
已经执行了
//将函数调用赋值给变量;此时函数已经执行了一次哈
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="text" id="input">
<script>
function debounce(func, delay) {
console.log(1)
let timer;
return function (args) {
clearInterval(timer);
timer = setTimeout(function () {
// 在delay秒内执行某一个func事件;
func(args)
}, delay)
}
}
function inputFunction(val) {
console.log(`你输出的结束是${val}`);
}
//此时的防抖函数已经被执行过一次了;在赋值的过程中;
const debouceInput = debounce(inputFunction, 500);
const input = document.getElementById("input");
input.addEventListener('keyup', function (e) {
debouceInput(e.target.value)
})
</script>
</body>
</html>
节流:
当持续触发事件的时候,
保证在一段时间内,只调用一次事件处理函数;
点击王者荣耀回城的时候,就需要使用节流哈~
典型就是:
鼠标不断点击触发;规定在n秒内多次点击只有一次生效
<button id="btn">点击我</button>
<script>
function throttle(func, awit) {
console.log("在赋值的饿时候我就会被触发")
let timerOut;
return function () {
// 第一次的时候,timerOut是undefined;
if (!timerOut) {
timerOut = setTimeout(function () {
// 当这件事情,做完后,马上设置为null或者undefined;目的:让下次可以进入这个函数
timerOut = null;
func();
}, awit)
}
}
}
function say() {
console.log("123")
}
document.getElementById("btn").onclick = throttle(say, 2000)