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


Posted in Javascript onOctober 22, 2020

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

1.节流函数throttle

// 节流方案1,每delay的时间执行一次,通过开关控制
function throttle(fn, delay, ctx) {
  let isAvail = true
  return 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 = 0
      return 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 = null
  return 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 = null
  return function() {
    let args = arguments
    
    // 清空上一次操作
    clearTimeout(movement)
    
    // delay时间之后,任务执行
    movement = setTimeout(function() {
      fn.apply(ctx, args)
    }, delay)
  }
}

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

Javascript 相关文章推荐
从Ajax到JQuery Ajax学习
Feb 14 Javascript
JavaScript中的变量声明早于赋值分析
Mar 01 Javascript
jquery显示和隐藏div特效实例
Feb 27 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
Jun 30 Javascript
微信小程序 loading(加载中提示框)实例
Oct 28 Javascript
详解ECharts使用心得总结
Dec 06 Javascript
canvas实现粒子时钟效果
Feb 06 Javascript
详解angularJS自定义指令间的相互交互
Jul 05 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
Sep 16 Javascript
node.js事件轮询机制原理知识点
Dec 22 Javascript
vue随机验证码组件的封装实现
Feb 19 Javascript
ant-design-vue按需加载的坑的解决
May 14 Javascript
如何通过Proxy实现JSBridge模块化封装
Oct 22 #Javascript
微信小程序canvas动态时钟
Oct 22 #Javascript
vue-cli —— 如何局部修改Element样式
Oct 22 #Javascript
微信小程序入门之绘制时钟
Oct 22 #Javascript
微信小程序入门之指南针
Oct 22 #Javascript
微信小程序实现拼图小游戏
Oct 22 #Javascript
Vue select 绑定动态变量的实例讲解
Oct 22 #Javascript
You might like
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
推荐dojo学习笔记
2007/03/24 Javascript
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
基于jquery点击自以外任意处,关闭自身的代码
2012/02/10 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
python解析json实例方法
2013/11/19 Python
python中常用检测字符串相关函数汇总
2015/04/15 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
使用Python实现租车计费系统的两种方法
2018/09/29 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
Bluebella美国官网:英国性感内衣品牌
2018/10/04 全球购物
学生手册家长评语
2014/02/10 职场文书
会计专业大学生职业生涯规划书
2014/02/11 职场文书
创建文明城市标语
2014/06/16 职场文书
生活部的活动方案
2014/08/19 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
2019财务转正述职报告
2019/06/27 职场文书
创业计划书之家政服务
2019/09/18 职场文书
总结高并发下Nginx性能如何优化
2021/11/01 Servers
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL