18-检验闭包是否真正理解?


 实现:

function fun(...args) {
  if (args[2]) {
    console.log("exec");
  }
  return args[0];
}
function memo(fn) {
  var temp = [];
  var flag = true;
  //return出去的这个函数其实就是fun2
  return (...arg) => {
    for (let val of temp.values()) {
      if (val.join(",") === arg.join(",")) {
        flag = false;
      }
    }
    temp.push(arg);
    let res = fn.apply(this, [...arg, flag]);
    return res;
  };
}

const fun2 = memo(fun);
console.log(fun2(1, 2)); // 输出 exec 返回 1
console.log(fun2(2, 2)); // 输出 exec 返回 2
console.log(fun2(1, 2)); // 没有输出 仅返回 1
console.log(fun2(2, 2)); // 没有输出 仅返回 2

 新:

function fun(...args) {
  console.log("exec");
  return args[0];
}
function memo(fn) {
  var count = 0;
  return (...args) => {
    count++;
    if (count > 2) {
      return args[0];
    }
    return fn(...args);
  };
}

var fun2 = memo(fun);
console.log(fun2(1, 2)); //输出 exec 返回1
console.log(fun2(2, 2)); //输出 exec 返回2
console.log(fun2(1, 2)); //没有输出,仅返回1
console.log(fun2(2, 2)); //没有输出,仅返回2

 

posted @ 2021-06-24 14:41  猎奇游渔  阅读(30)  评论(0编辑  收藏  举报