函数防抖和节流

  • 防抖

    应用场景:比如input输入事件,要实时展示搜索结果。每次change事件都会发送一次请求,仅从资源上来说是 很浪费的行为,而且在实际应用中,也是用户输入完毕之后才会请求展示搜索结果。所以加用防抖或者节流函数包括一下。

  1. function dedounce(func, delay = 500) {
  2. let timer = null;
  3. return function (...args) {
  4. if(timer){
  5. clearTimeout(timer);
  6. timer = null;
  7. }
  8. timer = setTimeout(
  9. () => {
  10. func.apply(this,args)
  11. },
  12. delay
  13. )
  14. }
  15. }
  16. //更加简洁
  17. function dedounce(method, context) {
  18. clearTimeout(method.tId);
  19. method.tId = setTimeout(function () {
  20. method.call(context);
  21. }, 100)
  22. }
  • 节流

    返回的函数在一段时间内只会执行一次,比如用在滚动事件的回调。

function th(func, delay = 2000) {
  let now = new Date().getTime();
  return function () {
    let newNow = new Date().getTime();
    if (newNow - now > delay) {
      now = newNow;
      func.apply(this, arguments);
    }
  }
}
  • 函数防抖和函数节流都是防止某一时间频繁触发,但是这两兄弟之间的原理却不一样。
  • 函数防抖是某一段时间内只执行一次,而函数节流是间隔时间执行。

函数柯里化

// 第一版
//利用slice 加回调的方式。但是回调的参数没法导正

var curry = function (fn) {
    var args = [].slice.call(arguments, 1);
    return function() {
        var newArgs = args.concat([].slice.call(arguments));
        return fn.apply(this, newArgs);
    };
};

//利用toString的特性,但是不好看
    function add() {
            // 第一次执行时,定义一个数组专门用来存储所有的参数
            let args = [].slice.call(arguments);

            // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
            var inner = function () {
                args.push(...arguments);
                return inner;
            };

            // 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
            inner.toString = () => args.reduce((prev, curr) => prev + curr);
            return inner;
        }