如何利用闭包实现阶乘

实现阶乘效果并不难,这里直接上代码

function factor (target){
    for(let i =target; i>0;i--){
            sum = sum * i;
        }
        return sum;
    }
}
console.log(factor(100));
复制代码

这里直接打印出来,可以看到数字很大, image.png

仔细想一想这里有一点可以改进的地方: 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));
复制代码

效果如下: image.png

小结

闭包并没有想象的那么简单,这只是闭包最简单的形式。正如大佬讲的,可以把闭包当做背包。当一个函数被创建并传递或从另一个函数返回时,它会携带一个装了所有变量的背包。

感谢支持原创作品

猜你喜欢

转载自juejin.im/post/7016970261484273701