如何在面试中手写出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 相关文章推荐
Ext grid 添加右击菜单
Nov 26 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
Nov 27 Javascript
JavaScript 学习笔记之变量及其作用域
Jan 14 Javascript
Javascript通过overflow控制列表闭合与展开的方法
May 15 Javascript
jquery判断复选框是否选中进行答题提示特效
Dec 10 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
May 30 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
Jun 24 Javascript
jquery 判断selection range 是否在容器中的简单实例
Aug 02 Javascript
React 子组件向父组件传值的方法
Jul 24 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
Oct 23 Javascript
bootstrap-Treeview实现级联勾选
Nov 23 Javascript
jquery实现Ajax请求的几种常见方式总结
May 28 jQuery
如何通过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的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
监听element-ui table滚动事件的方法
2019/03/26 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
浅析python继承与多重继承
2018/09/13 Python
在python中实现调用可执行文件.exe的3种方法
2019/07/07 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
使用Python操作ArangoDB的方法步骤
2020/02/02 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
Python之变量类型和if判断方式
2020/05/05 Python
Python 代码调试技巧示例代码
2020/08/11 Python
python 检测图片是否有马赛克
2020/12/01 Python
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
办理护照介绍信
2014/01/16 职场文书
财务信息服务专业自荐书范文
2014/02/08 职场文书
六年级学生期末评语
2014/12/26 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
实现一个简单得数据响应系统
2021/11/11 Javascript
httpclient调用远程接口的方法
2022/08/14 Java/Android