<!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>
<button onclick="btnFun();">onclick</button>
<button id="btn">addListener</button>
</body>
<script>
//防抖函数是一个生成器,返回给每个相同的方法一个函数
function debounce(fn, wait) {
//正确的情况下这里的1111只会打印一次
console.log("1111");
let timer = null;
//此处返回的是一个函数
return function () {
//之后多次点击,这里的timer是上次执行所生成的timer,不为null
if (timer !== null) {
console.log(timer);
//把定时器清空
clearTimeout(timer);
}
//重新开始计时
timer = setTimeout(fn, wait);
}
}
function handle() {
console.log(Math.random());
}
// window.addEventListener("resize", debounce(handle, 1000));
let btn = document.getElementById("btn");
//addListener在注册监听时就得到了返回的函数,下次再点击就不会再执行debounce函数,而是执行返回的函数(即使用返回的函数作为点击的回调函数)
btn.addEventListener("click", debounce(handle, 1000));
//而onclick执行得到的就是返回的函数
//如果直接像下面这样写,第一种不会执行,第二种每次都返回一个新函数,都会按设定的事件依次执行
//第一种
// function btnFun(){
// debounce(handle, 1000);
// }
//第二种
// function bntFun(){
// debounce(handle, 1000)();
// }
// 正确的写法,先将返回的函数赋值给btnFun,然后点击的时候执行btnFun即可
let btnFun = debounce(handle, 1000);
</script>
</html>