以很高的频率触发防抖函数,刚开始控制台不会输出内容,防抖函数是生效的,持续短暂的时间后就会发现控制台一直在输出内容,就是说明防抖函数在这个情况下失效了,请问是为什么
```javascript
var btn = document.getElementById('btn');
function debounce (fn, delay) {
let timer = null
return function () {
// 在规定时间内再次触发会先清除定时器后再重设定时器
// console.log(timer)
clearTimeout(timer);
timer = setTimeout(function () {
// console.log(this, timer)
fn.apply(this, arguments);
}, delay);
}
}
function fn () {
console.log('防抖')
}
// 就是这一行
btn.onclick = function () {
debounce(fn, 3000)()
}
```
该回答引用chatgpt:
根据您提供的代码,问题出在这一行:
btn.onclick = function () {
debounce(fn, 3000)()
}
这里没有将防抖函数返回的函数保存下来,而是直接执行了一次,所以每次点击按钮的时候都会重新创建一个防抖函数并立即执行,而防抖函数的作用是在一定时间内不执行函数,如果频繁调用的话就相当于没有起到防抖的作用。
可以将这一行代码修改为:
btn.onclick = debounce(fn, 3000);
这样,每次点击按钮时都会执行防抖函数返回的函数,而不是重新创建一个函数并立即执行。
你好 你没有清除之前的定时器
```javascript
var btn = document.getElementById('btn');
let timer = null
function debounce(fn, delay) {
return function () {
// 在规定时间内再次触发会先清除定时器后再重设定时器
// console.log(timer)
if (timer){
clearTimeout(timer);
}
timer = setTimeout(function () {
// console.log(this, timer)
fn.apply(this, arguments);
}, delay);
}
}
function fn() {
console.log('防抖')
}
// 就是这一行
btn.onclick = function () {
debounce(fn, 3000)()
}
```
每次点击的时候timer都是一个新的,并不是之前的,所以导致防抖失效,仍然会触发多次。
需要将timer提升一级。
<script>
var btn = document.getElementById("btn");
let timer = null;
function debounce(fn, delay) {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(function () {
fn.apply(this, arguments);
}, delay);
}
function fn() {
console.log("防抖");
}
// 就是这一行
btn.onclick = function () {
debounce(fn, 3000);
};
</script>
后端框架,博主不太了解,但也知道有 JavaSpringBoot、JavaSpringMVC
前端Web管理后台:可以用 根据Vue与ElementUI开发的前端管理后台,这里推荐vue-element-admin
小程序:可以使用vue风格的wepy、mpvue,也可以使用Recat风格的Taro,当然你也可以选择小程序原生
H5:一样可以使用mpvue和Taro
tip:强烈建议大家先学Vue和Recat,这样的话大家学习成本会相对比较低。(当然是在有一定基础的情况下)