题目解读
解析防抖与节流,列举场景,代码,没有es6的情况
场景
- 防抖:在搜索输入框中,根据用户输入内容变化动态展示联想搜索词
- 节流:抢票啊、提交数据、切换、轮播和部分Animate动画中,执行完上一次操作后才能再次点击执行对应的函数
防抖
连续调用一个fn时,只有最后一次的调用会被执行
function debounce(fn, delay = 500, immediate = false) {let timer;return function (...args) {if (immediate) {if (timer) {clearTimeout(timer);} else {fn.apply(this, ...args)}timer = setTimeout(() => {timer = null;}, delay);} else {if (timer) {clearTimeout(timer);}timer = setTimeout(() => {fn.apply(this, ...args)}, delay);}}}function debounce(fn, delay = 500, immediate = false) {let timer;return function (...args) {if (timer) {clearTimeout(timer);}if (immediate && !timer) {fn.apply(this, ...args)}timer = setTimeout(() => {timer = null;!immediate && fn.apply(this, ...args)}, delay);}}function debounce(fn, delay = 500, immediate = false) {let timer,later = function (args) {return setTimeout(() => {timer = null;!immediate && fn.apply(this, args);}, delay)}return function (...args) {if (timer) {clearTimeout(timer);timer = later(args);} else {timer = later();immediate && fn.apply(this, args);}}}// 没有es6怎么办function debounce(fn, delay = 500, immediate = false) {let timer, context, args,later = function () {return setTimeout(function () {timer = null;!immediate && fn.apply(context, args);context = args = null;}, delay)}return function () {context = this;args = arguments;if (timer) {clearTimeout(timer);timer = later();} else {timer = later();immediate && fn.apply(this, args);}}}
节流
连续调用一个fn时,每隔一段时间调用一次
// 头触发function throttle(fn, delay) {let timer;return function (...args) {if (timer) {return;}fn.apply(this, args);timer = setTimeout(() => {timer = null;}, delay);}}// 尾触发function throttle(fn, delay) {let timer;return function (...args) {if (timer) {return;}timer = setTimeout(() => {fn.apply(this, args);timer = null;}, delay);}}// 头尾触发function throttle(fn, delay) {let timer;return function (...args) {if (timer) {return;}fn.apply(this, args);timer = setTimeout(() => {fn.apply(this, args);timer = null;}, delay);}}// 没有es6function throttle(fn, delay) {let timer, context, args;return function (...args) {context = this;args = arguments;if (timer) {return;}fn.apply(this, args);timer = setTimeout(function() {fn.apply(context, args);timer = null;context = args = null;}, delay);}}
