如何在面试中手写出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 相关文章推荐
javascript基础的动画教程,直观易懂
Jan 10 Javascript
Javascript & DHTML 实例编程(教程)DOM基础和基本API
Jun 02 Javascript
google 搜索框添加关键字实现代码
Apr 24 Javascript
人人网javascript面试题 可以提前实现下
Jan 05 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
Jun 18 Javascript
js日期时间补零的小例子
Mar 05 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
js设置控件的隐藏与显示的两种方法
Aug 21 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
Oct 29 Javascript
vue实现简单实时汇率计算功能
Jan 15 Javascript
VUE脚手架具体使用方法
May 20 Javascript
微信小程序实现翻牌抽奖动画
Sep 21 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
php 什么是PEAR?(第三篇)
2009/03/19 PHP
php小偷相关截取函数备忘
2010/11/28 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
js Map List 遍历使用示例
2013/07/10 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
微信小程序实现随机验证码功能
2018/12/20 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python中的并发编程实例
2014/07/07 Python
python创建和删除目录的方法
2015/04/29 Python
Ubuntu安装Jupyter Notebook教程
2017/10/18 Python
python 中if else 语句的作用及示例代码
2018/03/05 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
python如何制作英文字典
2019/06/25 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
2014年五一活动策划方案
2014/03/15 职场文书
违反交通法规检讨书
2014/09/10 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
股份转让协议书范本
2015/01/27 职场文书
公积金接收函格式
2015/01/30 职场文书