当前位置: 首页 > Web前端 > JavaScript

JavaScript咖喱

时间:2023-03-27 14:11:34 JavaScript

Curry当一个函数有多个参数时,先传递一部分参数来调用它(这部分参数以后永远不会改变)然后返回一个新的函数来接收剩余的参数并返回结果//CurrydemofunctioncheckAge(age){让min=18;returnage>=min;}//普通纯函数functioncheckAge(min,age){returnage>=min;}console.log(checkAge(18,25))console.log(checkAge(18,26))console.log(checkAge(18,27))console.log(checkAge(18,28))console.log(checkAge(24,29))console.log(checkAge(24,29))functioncheckAge(min){返回函数(年龄){返回年龄>=分钟;}}letcheckAge18=checkAge(18);letcheckAge20=checkAge(20);console.log(checkAge18(20));console.log(checkAge20(24));//es6写法letcheckAgeEs6=min=>(age=>年龄>=分钟);让checkAgeEs618=checkAgeEs6(18);让checkAgeEs620=checkAgeEs6(20);console.log(checkAgeEs618(20));console.log(checkAgeEs620(24));//当函数有多个参数时,转化为使用一个函数传入一些参数,让这个函数返回一个新的函数。new函数接收剩下的参数并返回处理结果Tips:当函数有多个参数时,转化为使用一个函数传入一些参数,让这个函数返回一个新的函数。新函数接收剩余的参数并返回处理结果。lodash中的curry方法curry(function)Function:创建一个接收一个或多个函数参数的函数,如果提供了函数需要的所有参数则执行functionon返回执行结果,否则继续返回函数等待接收剩余参数参数:需要柯里化的函数返回值:柯里化后的函数//lodash中的curry基本都是用const_=require("lodash");//一个参数叫一元函数,两个叫二元函数,三个叫三元函数函数//curryconstcurried=_.curry(getSum);console.log(curried(1)(2)(3));console.log(curried(1)(2,3));console.log(curried(1,2)(3));//柯里化case//case1判断字符串中是否有空格''.match(/\s+/g);//匹配所有数组''.match(/\d+/g);//普通函数match(reg,str){returnstr.match(reg);}//CurriedconstcurryMatch=_.curry(function(reg,str){returnstr.match(reg);});consthaveSpace=curryMatch(/\s+/g);consthaveNumber=curryMatch(/\d+/g);console.log(haveSpace("123456"))console.log(haveNumber("123456"))//查找数组中的空白字符元素constfilter=_.curry(function(func,array){returnarray.filter(func);})constfindSpace=filter(haveSpace);//es6写constfilterEs6=_.curry((func,array)=>array.filter(func));constfindSpaceES6=filter(haveSpace);console.log(findSpace(['aaaabbbb','ab']));//['ab']console.log(findSpaceES6(['aaaabbbb','ab']));//['aaaabbbb','ab']柯里化原理一个柯里化函数首先会接受一些参数,接收到这些参数后,该函数不会立即求值,而是会继续返回另一个函数,刚刚传入的参数会保存在该函数形成的闭包中。当函数确实需要求值时,会一次性使用之前传入的所有参数进行求值//CurrydemofunctioncheckAge(age){letmin=18;returnage>=min;}//普通纯函数functioncheckAge(min,age){returnage>=min;}console.log(checkAge(18,25))console.log(checkAge(18,26))console.log(checkAge(18,27))console.log(checkAge(18,28))console.log(checkAge(24,29))console.log(checkAge(24,29))functioncheckAge(min){返回函数(年龄){返回年龄>=分钟;}}letcheckAge18=checkAge(18);letcheckAge20=checkAge(20);console.log(checkAge18(20));console.log(checkAge20(24));//es6写法letcheckAgeEs6=min=>(age=>年龄>=分钟);letcheckAgeEs618=checkAgeEs6(18);letcheckAgeEs620=checkAgeEs6(20);console.log(checkAgeEs618(20));console.log(checkAgeEs620(24));//当函数有多个参数时,修改为使用一个函数,传入一些参数,让这个函数返回一个新的函数。新函数接收剩余的参数并返回处理结果。lodash中的咖喱//lodash中的curry基本都是用const_=require("lodash");//一个参数叫一元函数,两个叫二元函数,三个叫三元函数functiongetSum(a,b,c){returna+b+c;}//curried将多元函数转换为一元函数//curryconstcurried=_.curry(getSum);console.log(curried(1)(2)(3));console.log(curried(1)(2,3));console.log(curried(1,2)(3));//Curriedcase//Case1判断一个string.match(/\s+/g);//匹配所有数组''.match(/\d+/g);//普通函数match(reg,str){returnstr.match(reg);}//CurriedconstcurryMatch=_.curry(function(reg,str){returnstr.match(reg);});consthaveSpace=curryMatch(/\s+/g);consthaveNumber=curryMatch(/\d+/g);console.log(haveSpace("123456"))console.log(haveNumber("123456"))//查找数组中的空白字符元素constfilter=_.curry(function(func,array){returnarray.filter(func);})constfindSpace=filter(haveSpace);//es6写constfilterEs6=_.curry((func,array)=>array.filter(func));constfindSpaceES6=filter(haveSpace);console.log(findSpace(['aaaabbbb','ab']));//['ab']console.log(findSpaceES6(['aaaabbbb','ab']));//['aaaabbbb','ab']模拟柯里化原理functioncurry(func){returnfunctioncurriedFn(...args){//实参和形参个数的判断function.length写法得到函数参数的长度//如果实参小于形参的长度,返回一个函数继续接受参数//形成一个闭包,保持args参数依次叠加,直到大于或等于形参且条件不满足Callfunc(...args)if(args.length