如何在面试中手写出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 KeyDown、KeyPress和KeyUp事件的区别与联系
Dec 03 Javascript
js替换字符串的所有示例代码
Jul 23 Javascript
javascript实现右下角广告框效果
Feb 01 Javascript
微信小程序仿知乎实现评论留言功能
Nov 28 Javascript
详解javascript函数写法大全
Mar 25 Javascript
微信小程序如何使用canvas二维码保存至手机相册
Jul 15 Javascript
解决layui 三级联动下拉框更新时回显的问题
Sep 03 Javascript
Vue数字输入框组件示例代码详解
Jan 15 Javascript
weui上传多图片,压缩,base64编码的示例代码
Jun 22 Javascript
iview实现图片上传功能
Jun 29 Javascript
ant design vue datepicker日期选择器中文化操作
Oct 28 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
Nov 09 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文件上传表单摘自drupal的代码
2011/02/15 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
2018/05/23 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
理解javascript中的闭包
2017/01/11 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
Three.js中矩阵和向量的使用教程
2019/03/19 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
[02:34]DOTA2亚洲邀请赛 BG战队出场宣传片
2015/03/09 DOTA
Python 多线程抓取图片效率对比
2016/02/27 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
Python列表对象实现原理详解
2019/07/01 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
服务之星获奖感言
2014/01/21 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
导游词开场白
2015/01/31 职场文书
java设计模式--建造者模式详解
2021/07/21 Java/Android
Nginx报错104:Connection reset by peer问题的解决及分析
2022/07/23 Servers