封装一个阶乘
思路:
- 在闭包中定义一个对象,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));