JS中的局部实现细节控制的原则--笔记

  • once函数
    • 使用场景
      • 只允许回调函数只执行一次的方法
      • 异步请求数据(提交表单的时候)
// 抽象一个 once高阶函数,返回函数
// 过程抽象的方法 来抽象出一个once函数

function once(fn){
  return function(...args){
    if(fn){
      let ret = fn.apply(this, args);
      fn = null;
      return ret;
    }
  }
}

// 最新浏览器可以这样写,保证只点击一次,ie比较老的版本可能会不支持
 block.addEventListener('click',()=>{
 // do something
},{once: true})

  • 节流
    • 使用场景
      •  在很大的元素或者画布上监听 浏览器滚轮,mousemove事件,触发频率很高的时候就需要使用节流函数,来解节约资源
  function throttle(fn, time = 500){
  let timer;
  return function(...args){
    if(timer == null){
      fn.apply(this,  args);
      timer = setTimeout(() => {
        timer = null;
      }, time)
    }
  }
}
  • debounce
    • 使用场景
    • 用户行为最终状态,比如点按钮很多次连续点的时候,只执行一次。避免用户重复提交

//  debounce函数
function debounce(fn, dur){
  dur = dur || 100;
  var timer;
  return function(){
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, dur);
  }
}
  • 消费者:执行方法的时候不会直接执行,而是把它放到任务队列里;每个多少毫秒去执行它。由此将同步的操作变成异步的操作。
    function consumer(fn, time){
      let tasks = [],
        timer;
      return function(...args){
        tasks.push(fn.bind(this, ...args));
        if(timer == null){
          timer = setInterval(() => {
            tasks.shift().call(this)
            if(tasks.length <= 0){
              clearInterval(timer);
              timer = null;
            }
          }, time)
        }
      }
    }
function iterative(fn){
  return function(...args){
    return args.reduce(fn.bind(this))
  }
}

once throttle debounced consumer iterative都是高阶函数

它们自身输入函数或返回函数,被称为高阶函数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值