如何在面试中手写出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自执行闭包的小例子
Jun 29 Javascript
jquery中的过滤操作详细解析
Dec 02 Javascript
javascript回车完美实现tab切换功能
Mar 13 Javascript
javascript实现label标签跳出循环操作
Mar 06 Javascript
Bootstrap3制作图片轮播效果
May 12 Javascript
基于jQuery实现仿百度首页选项卡切换效果
May 29 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
Dec 18 Javascript
JS实现DIV高度自适应窗口示例
Feb 16 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
Nov 02 Javascript
JS基于for语句编写的九九乘法表示例
Jan 04 Javascript
详解JavaScript中的强制类型转换
Apr 15 Javascript
js实现简易计算器小功能
Nov 18 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
php采集时被封ip的解决方法
2010/08/29 PHP
php入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
php检查页面是否被百度收录
2015/10/28 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
JavaScript实现打字效果的方法
2015/07/10 Javascript
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
python迭代器实例简析
2014/09/25 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
python 读取、写入txt文件的示例
2020/09/27 Python
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
关于打架的检讨书
2014/01/17 职场文书
监察建议书范文
2014/03/12 职场文书
课外科技活动总结
2014/08/27 职场文书
低碳环保演讲稿
2014/08/28 职场文书
公务员培的训心得体会
2014/09/01 职场文书
入党现实表现材料
2014/12/23 职场文书
安全先进个人材料
2014/12/29 职场文书
财产保全担保书
2015/01/20 职场文书
幼儿园教师辞职信
2019/06/21 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
如何优化vue打包文件过大
2022/04/13 Vue.js
React更新渲染原理深入分析
2022/12/24 Javascript