自动门感应到有人,打开门,并且开始5秒倒计时,在 5 s 内有另外一个人靠近到门,门感应到人,重新5秒倒计时
当事件被触发时,设定一个延迟,若期间事件又被触发,则重新设定延迟,直到延迟结束,执行动作 (防止多次触发)
web 应用上面
改变页面大小的统计 滚动页面位置的统计 输入框连续输入的请求次数控制
一开始,点击按钮,console.log('pay money')
<body>
<button id="btn">click</button>
</body>
<script>
const btn = document.getElementById('btn')
function payMoney() {
console.log('pay money');
}
btn.addEventListener('click', payMoney)
</script>
定义 debounce
const btn = document.getElementById('btn')
function payMoney() {
console.log('pay money');
}
function debounce(func) {
// 在函数里面返回函数 , 只有当点击的时候才返回该函数
return function () {
func()
}
}
btn.addEventListener('click', debounce(payMoney))
设置延时
const btn = document.getElementById('btn')
function payMoney() {
console.log('pay money');
}
function debounce(func, delay) {
return function () {
setTimeout(_ => func(), delay)
}
}
btn.addEventListener('click', debounce(payMoney, 1000))
清除延时:未能执行
原因
每次点击的时候就会执行返回函数里面的内容
每次点击的执行函数都是独立的,互不干涉
正因为他们之间没有联系,清除延时在这里完全没有起作用
要让这些独立的执行函数之间有联系,需要用到作用域链(闭包)
JavaScript 防抖和节流细解
本文来自网络,不代表糖果站长网立场,转载请注明出处:https://www.1tg.com.cn/html/shuju/2021/1122/21442.html
