函数式编程


和Lisp、Haskell不同,javascript并非函数式编程语言,但在javascript中可以操控对象一样操控函数,也就是说可以在javascript中应用函数式编程技术。ES5中的数组方法(如map()和reduce())就可以非常适合用于函数式编程风格。本文将详细介绍函数式编程  假设免费云主机域名有一个数组,数组元素都是数字,想要计算这些元素的平均值和标准差。若使用非函数式编程风格的话,如下所示  可以使用数组方法map()和reduce()实现同样的计算,这种实现极其简洁  在ES3中,并不包含这些数组方法,需要自定义map()和reduce()函数  高阶函数(higher-order function)指操作函数的函数,它接收一个或多个函数作为参数,并返回一个新函数  上面的not()函数就是一个高阶函数,因为它接收一个函数作为参数,并返回一个新函数  下面的mapper()函数,也是接收一个函数作为参数,并返回一个新函数,这个新函数将一个数组映射到另一个使用这个函数的数组上  下面是一个更常见的例子,它接收两个函数f()和g(),并返回一个新函数用以计算f(g())  不完全函数是一种函数变换技巧,即把一次完整的函数调用拆成多次函数调用,每次传入的实参都是完整实参的一部分,每个拆分开的函数叫做不完全函数,每次函数调用叫做不完全调用。这种函数变换的特点是每次调用都返回一个函数,直到得到最终运行结果为止  函数f()的bind()方法返回一个新函数,给新函数传入特定的上下文和一组指定的参数,然后调用函数f()。bind()方法只是将实参放在完整实参列表的左侧,也就是说传入bind()的实参都是放在传入原始函数的实参列表开始的位置,但有时希望将传入bind()的实参放在完整实参列表的右侧  利用这种不完全函数的编程技巧,可以编写一些有意思的代码,利用已有的函数来定义新的函数  当将不完全调用和其他高阶函数整合在一起时,事件就变得格外有趣了。比如,下例定义了not()函数  可以使用不完全调用的组合来重新组织求平均数和标准差的代码,这种编码风格是非常纯粹的函数式编程  将上次的计算结果缓存起来,在函数式编程中,这种缓存技巧叫做记忆(memorization)。记忆只是一种编程技巧,本质上是牺牲算法的空间复杂度以换取更优的时间复杂度,在客户端javascript中代码的执行时间复杂度往往成为瓶颈,因此在大多数场景下,这种牺牲空间换取时间的做法以提升程序执行效率的做法是非常可取的  memorize()函数创建一个新的对象,这个对象被当作缓存的宿主,并赋值给一个局部变量,因此对于返回的函数来说它是私有的。所返回的函数将它的实参数组转换成字符串,并将字符串用做缓存对象的属性名。如果在缓存中存在这个值,则直接返回它;否则,就调用既定的函数对实参进行计算,将计算结果缓存起来并返回  写一个递归函数时,往往需要实现记忆功能,我们更希望调用实现了记忆功能的递归函数,而不是原递归函数  下面利用连续调用单参函数来实现一个简易的加法运算  如果完全按照上面实现,则无法实现,因为add(1)(2)如果返回3,add(1)(2)(3)必然报错。于是,有以下两种变形方法  第一种变形如下:  第二种变形如下:

相关推荐: sersync实时同步

支持配置文件管理真正的守护进程socket可以对失败文件定时重传(定时任务功能)第三方的HTTP接口(例如更新cdn缓存)默认多线程同步[root@nfs01 local]# rz -E ##window安装包上传至Linuxrz waiting to rec…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/31 15:50
下一篇 01/31 17:55