闭包的概念和应用场景闭包是指可以访问自由变量的函数自由变量是指函数中使用的既不是函数参数也不是函数局部变量的变量从理论上讲:所有函数都是闭包。从实用的角度来说:即使创建它的AM/AM已经被销毁,它仍然存在(例如:内部函数,从父函数返回)。代码中引用了自由变量引用场景。柯里化函数避免了频繁调用相同参数的函数,同时可以方便的封装一个高阶函数functiongetArea(width,height){returnwidth*height;}constarea1=getArea(10,20);constarea2=getArea(10,30);常量area3=getArea(10,40);functiongetArea(width){return(height)=>{returnwidth*height;}}constgetTenWidthArea=getArea(10);constarea2=getTenWidthArea(30);constarea3=getTenWidthArea(40);变量其实就是模块的方式。现代封装其实就是每个模块的代码项目独立的匿名自执行函数varfun=(function(){varnum=0;returnfunction(){num++;returnnum;}})();console.log(fun())console.log(fun())console.log(fun())缓存一些结果在外函数中创建一个数组,闭包函数可以改变/获取数组函数的值funParent(){让备忘录=[];//生命周期被扩展functionfunTwo(i){memo.push(i);console.log(memo)}returnfunTwo}constfn=funParent();fn(1)fn(2)第一个练习题//实现一个compose函数,用法如下functionfn1(x){returnx+1}有趣ctionfn2(x){returnx+2}functionfn3(x){returnx+3}functionfn4(x){returnx+4}consta=compose(fn1,fn2,fn3,fn4);console.log(a(5))//1+4+3+2+1//实现方法//args数组列表对应fn1,fn2,fn3,fn4functioncompose(...args){return(x)=>{让arr=args.reduce((sum,cur)=>{returncur(sum)},x)returnarr}}第二个函数currying(fn,...args){constoriginLenth=fn.length;让allArgs=[...args];constresFn=(...newArgs)=>{//对多次传入的参数进行整合allArgs=[...allArgs,...newArgs];if(allArgs.length===originLenth){//当长度相等时,直接指向传入的fn函数获取返回值returnfn(...allArgs)}else{returnresFn}}returnresFn}constadd=(a,b,c)=>a+b+c;consta1=currying(add,1)consta2=a1(2);console.log(a2(3))//constadd=(a,b,c,f)=>a+b+c+f;//consta6=currying(add,1,2,9,28)//console.log(a6())总结创建私有变量来扩展可变生命周期
