及时行乐|JavaScript常用技巧之函数防抖
在触发一段时间后执行事件 , 如果这段时间内又触发了 , 则继续等待同样的时间 。
防抖在实际开发中使用场景还是蛮多 , 比如列表的实时搜索等 。 延时执行 , 这很容易想到使用setTimeout来实现 。
基础版
function debounce(func, wait) {let timer;return function () {timertimer = setTimeout(func, wait);};}
【及时行乐|JavaScript常用技巧之函数防抖】测试一下
// 使用input输入框做一个测试// html// jsinput.oninput = debounce(() => {text.innerHTML = input.value;}, 1000);
嗯 。 好像没什么问题 。 不过我们发现上面在获取input的值的时候使用的是input.value , 那其实oninput事件应该是存在一个参数是event , 可以直接使用event.target.value获取 。
// 使用input输入框做一个测试// html// jsinput.oninput = debounce((e) => {text.innerHTML = e.target.value; // Uncaught TypeError: Cannot read property 'target' of undefined}, 1000);
不出意料的报错了 , 这是因为debounce函数返回的是一个新的函数 , 并没有将原有函数的this值绑定到新的函数上 , 也没有将参数传递给新的函数 。 我们来改一改 。
处理了this和参数的版本
function debounce(func, wait) {let timer;return function (...args) {timertimer = setTimeout(() => {func.apply(this, args);}, wait);};}
这时候又来了个新需求 , 需要在计时开始时执行 , 而不是在结尾执行 。 同样的 , 原来的逻辑不变 , 只是需要新增一个立即执行的逻辑 。 想一想我们的需求:立即执行 , 然后在固定的一段时间内不再触发第二次。 在立即执行代码之后 , 可以设置一个变量flag(初始值为true)用来记录上一次执行的时间到现在是否超过wait , 如果超过则将flag设置为true , 意味着可以再次执行 。
function debounce(func, wait, immediate) {let timer;return function (...args) {timerif (immediate) {// timer就是我们使用的flagif (!timer) {func.apply(this, args);}// 在代码执行的wait s之后将timer设置为null// 当下一次执行当前函数则可以触发判断 !timer === truetimer = setTimeout(() => {timer = null;}, wait);} else {timer = setTimeout(() => {func.apply(this, args);}, wait);}};}
当然 , 我们还可以像lodash一样 , 添加cancel、pending等方法 。
function debounce(func, wait, immediate) {let timer;const debounced = function (...args) {timerif (immediate) {if (!timer) {func.apply(this, args);}timer = setTimeout(() => {timer = null;}, wait);} else {timer = setTimeout(() => {func.apply(this, args);timer = null;}, wait);}};debounced.cancel = function() {timer}debounced.pending = function() {return !!timer;}return debounced;}
文章来源:
最后
刚整理 2020 年全套最新精品技术资料免费发给你! (原价最少8999元 , 超2000G!)
领取 看看下面!!
- 及时行乐|苹果明天搞大事!新iPad、iPhone 12都来了
- 及时行乐|腾讯霸权:玩我的游戏产生的连续画面都是我的,网友:向垄断前进
- 科技资讯眺望|Oracle常用命令大全
- 及时行乐|中国到底有多强大?美智库曾称:中国早已成为科技超级大国
- 中国公众健康网|家庭药箱应储备哪些常用药?
- 及时行乐|不喜欢 merge 分叉,那就用 rebase 吧
- 美容|用哪种口红颜色真正滋润显白?推荐几款适合高中生日常用的口红
- 及时行乐|第三代B&O E8耳机好用么?个人使用真实分享(上)—缺点篇
- 孤独酒馆|jackson学习之六:常用类注解
- 宝石流云|程序员:常用的 Iterator 中的迭代器模式