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

day4如何通过部分应用和柯里化将函数具体化?

时间:2023-03-27 00:31:59 JavaScript

偏应用和柯里化函数的输入来自于参数,参数包括函数定义的形参和实际执行的实参。部分应用程序延迟了实际参数传输。函数式编程侧重于声明性和可读性。并强调每个功能都试图解决一个问题。在函数式编程中,我们经常使用偏应用。它所做的是抽象出一个部分的工具,在先预制一些参数的情况下,稍后再传入剩余的参数值。如下代码所示:varfetchOrder=partial(orderEventHandler,"http://some.api/order");vargetCurrentOrder=partial(fetchOrder,{order:CURRENT_ORDER_ID});...可以调用扩展算子在函数或数组构造中,在语法层面扩展数组表达式或字符串。在这里,我们可以使用它来处理前置和后置参数。这里的闭包又起到了记忆的作用,它会记住前置参数,下次收到后置参数时,就可以和之前记住的前置参数一起执行了。varpartial=(fn,...presetArgs)=>(...laterArgs)=>fn(...presetArgs,...laterArgs);每次通过柯里化传递一个参数,扩展运算符都可以在函数调用链中起到承上启下的作用。一个普通的函数通常在调用点执行时传入参数,而通过偏应用和柯里化,我们可以先传入一些已知的参数,稍后再传入一些参数,这样在时间和空间上,分离出一个功能。其他好处:处理未知数,将函数从抽象变为具体,让具体的函数每次只专注于做一件事,减少参数数量,还有一个更抽象的好处,就是体现底层的声明式风格功能思想。常用参数处理工具:在函数式编程中,我们称参数个数为arity。有些应用程序可以减少每次函数调用需要传递的参数个数,柯里化将一个函数调用需要传递的参数个数减少到1个,它们其实都起到了控制参数个数的作用.Transforminterfaceunary:一元参数(unary)将一个接收多个参数的函数变成一个只接收一个参数的函数。functionunary(fn){returnfunctiononeArg(arg){returnfn(arg);};}示例:["1","2","3","4","5"].map(unary(parseInt));//[1,2,3,4,5]Transformparameterconstant:functionsignature:函数签名一般包括参数及其类型返回值,以及该类型可能抛出或返回的异常,以及相关的Availability信息面向对象的方法(例如关键字public、static或prototype)。你可以看到在C或C++中,会有这样一个签名functionconstant(v){returnfunctionvalue(){returnv;};}我们可以将值包装在常量函数中,这样,您就可以将值作为函数参数传递。promise1.then(action1).then(constant(34)).then(action3);nomodificationidentity是函数式编程中常用的工具,即identity,既不改变函数也不改变参数。它的作用是输入一个值并返回相同的值。functionidentity(v){returnv;}可以用作过滤掉空值的谓词。在函数式编程中,断言是一个可以作为判断条件的函数。本例中使用identity作为判断一个值是否为空的断言。varwords="helloworld".split(/\s|\b/);words;//['','','','hello','world','','']words.filter(identity);//['hello','world']有很多方法可以重新排列参数的顺序。可以通过解构从数组和对象参数中提取值,并在给变量赋值时重新排序;或者使用扩展运算符将对象中的一组值“扩展”成单独的参数进行处理;或者使用.toString()和正则表达式解析函数中的参数进行处理。