思路:
第一步:直接封装方法。接收2个参数(fn:执行函数, time:设置默认执行时间)
第二步:声明定时器变量
第三步:return 函数,函数内部里假设有定时器就 return。没定时器就给定时器赋值延迟定时器,时间为 time
第四步:延迟定时器函数里用 apply 执行 fn,传入 this 事件源,arguments 接收剩余参数。然后清空定时器
第五步:使用示例
1.js 代码部分
// 封装防抖函数,接收执行函数,执行时间
function throttle(fn, time = 500) {
// 定时器变量
let timer = null
// 返回函数
return function() {
// 假设有定时器就继续执行
if(timer) return
// 如果没定时器就给定时器赋值,时间为 time
timer = setTimeout(() => {
// 用 apply 执行传进来的函数,this 为事件源,arguments 接收剩余参数
fn.apply(this, arguments)
// 清除定时器
timer = null
}, time)
}
}
// 使用实例
const div = document.querySelector('.box')
div.addEventListener('drag', throttle(function(e) {
console.log(e.pageX, e.pageY)
}, 1000))
.html 部分
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
width: 100px;
height: 100px;
border: 1px solid red;
text-align: center;
line-height: 100px;
}
</style>
</head>
<body>
<div class="box" draggable="true">可拖拽</div>
<script src="/throttle.js"></script>
</body>
</html>
标签:定时器,return,节流,timer,面试,time,手写,fn,函数
From: https://blog.csdn.net/2301_78901139/article/details/143927905