高阶函数、防抖与节流 | 青训营笔记

171 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天

高阶函数、防抖与节流 | 青训营笔记

高阶函数Higher-order function

  • 以函数作为参数
  • 以函数作为返回值
  • 常用于作为函数装饰器

Array.prototype.map

map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

map() 方法按照原始数组元素顺序依次处理元素。

注意: map() 不会对空数组进行检测。

注意: map() 不会改变原始数组。

语法

 array.map(function(currentValue,index,arr), thisValue)
  • function(currentValue, index,arr)

    • 必须。函数,数组中的每个元素都会执行这个函数
    • currentValue:必须。当前元素的值
    • index:可选。当前元素的索引值
    • arr:可选。当前元素属于的数组对象
  • thisValue:可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。

举例:创建二维数组

 const arr = new Array(row).fill(0).map(() => new Array(col).fill(0));

举例:字符串转数字

 ["1","2","3"].map((x)=>{
     return parseInt(x);
 });

简写:

 ["1","2","3"].map(x=>parseInt(x));

关于map高阶函数对应的一道经典面试题

如下函数的输出结果是[1,NaN,NaN]

 ["1", "2", "3"].map(parseInt);

见:【JS必知必会】高阶函数详解与实战 - 掘金 (juejin.cn)

Array.prototype.sort

举例:对数字排序

 [1,4,3,-1,66].sort((a, b) => a - b);
 //[ -1, 1, 3, 4, 66 ]

其他

防抖(Debounce)

防抖是将多次执行变为最后一次执行

青训营-Debounced - 码上掘金 (juejin.cn) 核心代码

// 2、防抖功能函数,接受传参
function debounce(fn, dur){
  dur = dur || 100;
  // 4、创建一个标记用来存放定时器的返回值
  var timer;
  return function(){
    // 5、每次当用户点击/输入的时候,把前一个定时器清除
    clearTimeout(timer);
    // 6、然后创建一个新的 setTimeout,这样就能保证点击按钮后的 interval 间隔内,如果用户还点击了的话,就不会执行 fn 函数
    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, dur);
  }
}
// 1、获取这个按钮,并绑定事件
// 3、fun:需要进行防抖的事件处理
document.addEventListener('mousemove', debounce(fun, 100));

节流(Throttle)

节流是将多次执行变成每隔一段时间执行。 青训营-Throttle - 码上掘金 (juejin.cn) 核心代码

// 2、节流函数
function throttle(fn, time = 500){
  // 4、通过闭包保存一个标记
  let timer;
  return function(...args){
    // 判断是否被调用
    if(timer == null){
      // 调用
      fn.apply(this,  args);
      // 调用完设置timer
      timer = setTimeout(() => {
        // 设置timer为空,可以再次调用了
        timer = null;
      }, time)
    }
  }
}
// 1、获取按钮,绑定点击事件
btn.onclick = throttle(function(e){// 3、需要节流的事件
  circle.innerHTML = parseInt(circle.innerHTML) + 1;
});

参考