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