实现阶乘效果并不难,这里直接上代码
function factor (target){
for(let i =target; i>0;i--){
sum = sum * i;
}
return sum;
}
}
console.log(factor(100));
复制代码
这里直接打印出来,可以看到数字很大,
仔细想一想这里有一点可以改进的地方: for循环了100次,因为用的是 let,所以每次循环都在内存中申明一个地址来存储i的值,非常消耗内存。所以这里可以把let 改为var,每次修改存储i地址里的值,这样代码运行的也快了很多。
function factor (target){
for(var i =target; i>0;i--){
sum = sum * i;
}
return sum;
}
}
console.log(factor(100));
复制代码
在仔细想一想,100! 如果每次都要实现从100一直乘到1,for循环100次不仅浪费内存,而且非常耗时。 有没有一种方法可以提高效率,实现更快的 100!?
有,答案就是利用闭包。
这里就利用了闭包和函数记忆的特性。
函数可以将之前运行的结果缓存在某个对象里,下次如果还有用这个值的话就可以直接从对象里调用该值,而不用重新计算,这样效率就大大的增加了。
这里用最简单的闭包展示一下效果(就是函数里包着一个函数)
let map = new Map(); // ES6的一种数据结构,可以用来存储键值对的数组,可以很快的查找数据
var sum =1;
return function (target){
if(map.has(target)){
console.log("已在缓存中获取到改值!");
return map.get(target);
}
for(var i =target; i>0;i--){
sum = sum * i;
}
map.set(target,sum); // 每次把计算完的数加入到字典里,target值作为key,value为累乘的结果
return sum;
}
}
let sum = summaration(); // 用对象sum来接收summaration的return的函数
console.log(sum(100));
console.log("----------");
console.log(sum(100));
复制代码
效果如下:
小结
闭包并没有想象的那么简单,这只是闭包最简单的形式。正如大佬讲的,可以把闭包当做背包。当一个函数被创建并传递或从另一个函数返回时,它会携带一个装了所有变量的背包。
感谢支持原创作品