js防抖节流
防抖
不希望某个事件在短时间内疯狂触发,影响性能,所以我们设置一个定时器,让这个事件在一定时间延迟后再执行,如果这个延迟中间中途这个事件又触发了,那就把上次事件绑定的定时器取消,避免了上次事件重复执行影响性能
- 输入完毕后过1s查询
function debounce(fn, delay) {
let timer;
return function() {
if(timer) clearTimeout(timer);
timer = setTimeout(function(){
fn.apply(this, arguments)
}, delay);
}
}
- 输入完毕后立马查询,过2s后才能再次查询(立即查询)
function debounce(fn, delay) {
let timer;
return function() {
if(timer) clearTimeout(timer);
let callnow = !timer;
timer = setTimeout(function(){
timer = null;
}, delay);
if(callnow) fn.apply(this, arguments);
}
}
function resize() {
console.log('视窗改变时需要执行些什么...')
}window.addEventListener('resize', debounce(resize, 1000))
节流 【js防抖节流】相比防抖,节流的概念更通俗,节约流量。如果一个方法在短时间内疯狂执行,我们希望它每隔一段时间执行。节约一点流量.
- 定时器实现
function throttle(fn, delay = 800) {
var timer = null;
var _delay = delay;
return function(){
if(!timer) {
timer = setTimeout(() => {
timer = null;
fn.apply();
}, _delay);
}
}
}
- 时间差实现
function throttle(fn, delay = 800) {
let prev = 0;
//上次记录的时间
return function(){
let now = Date.now();
//当前时间
if(now - prev > delay){
fn.apply(this);
prev = now;
}
}
}
function resize(n) {
return function () {
console.log('视窗改变时需要执行些什么...' + n++)
}
}
window.addEventListener('resize', throttle(resize(1)))
推荐阅读
- 安卓点击防抖优化手册(非代码层指导)
- 增效降本开源节流,2022年技术趋势前瞻(异步编程/容器技术)
- 字节流转换为字符串的方法
- 3句话帮你搞定Java I/O底层原理之一(字符流、字节流及其区别)
- vue中使用loadsh的debounce防抖函数
- Java——I/O(字节流、字符流与转换流 )
- 有了字节流,为什么还要有字符流
- 基于Vue-cli的手写轮播图(无限轮播,切换,点击预览)【函数节流】
- 嵌入式设备中按键的硬件防抖|嵌入式设备中按键的硬件防抖, 软件防抖和按键消息处理
- Vue中如何使用debouce防抖函数