封装一个阶乘
思路:
- 在闭包中定义一个对象,key 为传进来参数转成的字符串(数组的 join 办法)
- 判断对象中是否有传进来的值,有返回,否则计算,并将阶乘的后果存到这个对象中。
- 返回一个函数。
具体实现过程如下:
// 封装一个阶乘函数
// var mult = function(){
// var a = 1;
// for(let i=0;i<arguments.length;i++){// a = a*arguments[i]
// }
// return a
// }
// console.log(mult(1,2,3));
// ////////////////////////////////////////
// 优化 1,把阶乘过的后果存起来
// var catche = {};
// var mult = function () {
// var a = 1;
// let b = Array.prototype.join.call(arguments, ",");
// if (catche[b]) {// return catche[b]
// } else {// for (let i = 0; i < arguments.length; i++) {// a = a * arguments[i];
// }
// catche[b] = a;
// return a
// }
// }
// console.log(mult(1, 2, 3));
// console.log(mult(1, 2, 3));
// ////////////////////////////////////////
// 优化 2,将存后果的对象封装在闭包中
var mult = (function () {var catche = {};
var calculate = function(){
var a = 1;
for (let i = 0; i < arguments.length; i++) {a = a * arguments[i];
}
return a;
}
return function () {let args = Array.prototype.join.call(arguments, ",");
if (args in catche) {return catche[args]
}
return catche[args] = calculate.apply(null,arguments)
}
})();
console.log(mult(1, 2, 3));
console.log(mult(1, 2, 3));