JS代码片段

69 阅读1分钟

1. 闭包相关

  • 处理缓存
var fn = (function () {
  var arr = []; //用来缓存的数组
  return function (val) {
    if (arr.indexOf(val) == -1) {
      //缓存中没有则表示需要执行
      arr.push(val); //将参数push到缓存数组中
    } else {
      console.log("此次函数不需要执行");
    }
  };
})();
fn(10);
fn(10);
fn(100);

2. Curry

  • 处理累加
sum(2,3) == 5;
sum(2)(3) == 5;  
sum(2,3,4) == 9;  
sum(2)(3)(4) == 9;

方法1

function sum (...args) {
    // 无参数
    if (!args.length) return;
    
    //有参数进行累加
    function add (list) {
        return list.reduce((prev, cur) => {
            return prev + cur
        }, 0)
    }

    let total = add(args)
    
    // 构建闭包,存储累加值
    function k (...args) {
        total += add(args)
        return k
    }
    
    //重写k的toString方法
    k.toString = () => total
    return k
}

方法2

function curry(fn, args) {
    var length = fn.length;
    var args = args || [];
    return function(){
        newArgs = args.concat(Array.prototype.slice.call(arguments));
        if (newArgs.length < length) {
            return curry.call(this,fn,newArgs);
        }else{
            return fn.apply(this,newArgs);
        }
    }
}