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 = truereturn function () {if (timer) {clearTimeout(timer);timer = null}if (flag === true) {fn.apply(this, arguments);flag = false}timer = setTimeout(() => {flag = truetimer = null}, delay)}}
/*** 防抖函数** - 立即执行* - 非立即执行* @param {*} fn* @param {*} delay* @param {*} isImmediate*/function debounce(fn, delay = 500, isImmediate = true) {let timer = null;let flag = trueif (isImmediate === true) {return function () {if (timer) {clearTimeout(timer);timer = null}if (flag === true) {fn.apply(this, arguments);flag = false}timer = setTimeout(() => {flag = truetimer = 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 = falsevar 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 = falsevar timer = setTimeout(() => {fn.apply(this,arguments)flag = true},wait)}}}
在vue项目中methods中使用
第一步
第二步
用这种方式写函数
