1.防抖(立即执行/非立即执行)
什么是防抖:一个事件在触发后,设置定时器,若n秒内该事件没有再次发生,那么执行这个函数,如果n秒内该事件再次发生了,那么定时器重新开始计时。
应用
- 每次 resize / scroll 触发统计事件
- 文本输入的验证 (连续输入文字后发送AJAX请求进行验证,验证一次就好)
//防抖(非立即执行)
function debounce(fn, delay = 500) {
let timer = null;
return function () {
if (timer) {
clearTimeout(timer);
timer = null
}
timer = setTimeout(() => {
fn.apply(this, arguments);
timer = null;
}, delay)
}
}
//防抖(立即执行)
function debounce(fn, delay = 500) {
let timer = null;
let flag = true
return function () {
if (timer) {
clearTimeout(timer);
timer = null
}
if (flag === true) {
fn.apply(this, arguments);
flag = false
}
timer = setTimeout(() => {
flag = true
timer = null
}, delay)
}
}
/**
* 防抖函数
*
* - 立即执行
* - 非立即执行
* @param {*} fn
* @param {*} delay
* @param {*} isImmediate
*/
function debounce(fn, delay = 500, isImmediate = true) {
let timer = null;
let flag = true
if (isImmediate === true) {
return function () {
if (timer) {
clearTimeout(timer);
timer = null
}
if (flag === true) {
fn.apply(this, arguments);
flag = false
}
timer = setTimeout(() => {
flag = true
timer = null
}, delay)
}
} else {
return function () {
if (timer) {
clearTimeout(timer);
timer = null
}
timer = setTimeout(() => {
fn.apply(this, arguments);
timer = null;
}, delay)
}
}
}
2.节流(立即执行/非立即执行)
什么是节流:一个事件在n秒内被多次触发,但绑定的函数在期间只会执行一次(也就是降低函数的执行频率)
应用
- 与mousemove keyup/keydown 等相密切联系的函数
//定义函数
//节流(非立即执行)
function throttle_1(fn,wait){
var flag = true;
return function(){
if(flag == true){
flag = false
var timer = setTimeout(() => {
fn.apply(this,arguments)
flag = true
},wait)
}
}
}
//节流(立即执行)
function throttle_2(fn,wait){
var flag = true;
var timer = null;
return function(){
if(flag) {
fn.apply(this,arguments);
flag = false;
timer = setTimeout(() => {
flag = true
},wait)
}
}
}
//节流(合并)
function throttle_merge(fn,wait = 500,isImmediate = false){
var flag = true;
var timer = null;
if(isImmediate){
return function(){
if(flag) {
fn.apply(this,arguments);
flag = false;
timer = setTimeout(() => {
flag = true
},wait)
}
}
}
return function(){
if(flag == true){
flag = false
var timer = setTimeout(() => {
fn.apply(this,arguments)
flag = true
},wait)
}
}
}
在vue项目中methods中使用
第一步
第二步
用这种方式写函数