如何在面试中手写出javascript节流和防抖函数

面试的时候我们经常会问别人是理解什么是节流和防抖,严格的可能要求你写出节流和防抖函数,这里我们抛开loadsh工具库手写节流和防抖
【如何在面试中手写出javascript节流和防抖函数】1.节流函数throttle

// 节流方案1,每delay的时间执行一次,通过开关控制function throttle(fn, delay, ctx) {let isAvail = truereturn function () {let args = arguments // 开关打开时,执行任务 if (isAvail) {fn.apply(ctx, args)isAvail = false // delay时间之后,任务开关打开 setTimeout(function () { isAvail = true }, delay)}}}// 节流方案2,通过计算开始和结束时间function throttle(fn,delay){// 记录上一次函数出发的时间var lastTime = 0return function(){// 记录当前函数触发的时间var nowTime = new Date().getTime()// 当当前时间减去上一次执行时间大于这个指定间隔时间才让他触发这个函数if(nowTime - lastTime > delay){// 绑定this指向fn.call(this)//同步时间lastTime = nowTime}}}

2.防抖debounceTail

2.1)只执行首次
// 防抖 且首次执行// 采用原理:第一操作触发,连续操作时,最后一次操作打开任务开关(并非执行任务),任务将在下一次操作时触发)function debounceStart(fn, delay, ctx) {let immediate = true let movement = nullreturn function() {let args = arguments// 开关打开时,执行任务if (immediate) {fn.apply(ctx, args)immediate = false}// 清空上一次操作clearTimeout(movement)// 任务开关打开movement = setTimeout(function() {immediate = true}, delay)}}

2.2)只执行最后一次
// 防抖 尾部执行// 采用原理:连续操作时,上次设置的setTimeout被clear掉function debounceTail(fn, delay, ctx) {let movement = nullreturn function() {let args = arguments// 清空上一次操作clearTimeout(movement)// delay时间之后,任务执行movement = setTimeout(function() {fn.apply(ctx, args)}, delay)}}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读