1. 什么是高阶函数
高阶函数是对其他函数进行操作的函数,可以将它们作为参数或通过返回它们。简单来说,高阶函数是一个函数,它接收函数作为参数或将函数作为输出返回。
常见的如Array.prototype.map
,Array.prototype.filter
,Array.prototype.reduce
这些以回调函数作为参数的都是一些高阶函数。
2. 尾调用和尾递归
尾调用(Tail Call)是函数式编程的一个重要概念,本身非常简单,一句话就能说清楚。就是指某个函数的最后一步是调用另一个函数。
1 | function g(x) { |
尾调用不一定出现在函数尾部,只要是最后一步操作即可。
函数调用自身,称为递归。如果尾调用自身,就称为尾递归。递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生栈溢出错误。但是队伍尾递归来说,由于只存在一个调用帧,所以永远不会发生栈溢出错误。
1 | function factorial(n) { |
复制代码上面代码是一个阶乘函数,计算 n 的阶乘,最多需要保存 n 个调用数据,复杂度为 O(n),如果改写成尾调用,只保留一个调用记录,复杂度为 O(1)。
1 | function factor(n, total) { |
复制代码斐波拉切数列也是可以用于尾调用。
1 | function Fibonacci(n) { |
3. 柯理化函数
在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。所谓柯里化就是把具有较多参数的函数转换成具有较少参数的函数的过程。
比如校验电话号码、校验邮箱、校验身份证号、校验密码等, 这时我们会封装一个通用函数 checkByRegExp ,接收两个参数,校验的正则对象和待校验的字符串
1 | function checkByRegExp(regExp, string) { |
每次进行校验的时候都需要输入一串正则,再校验同一类型的数据时,相同的正则我们需要写多次, 这就导致我们在使用的时候效率低下,并且由于 checkByRegExp 函数本身是一个工具函数并没有任何意义。此时,我们可以借助柯里化对 checkByRegExp 函数进行封装,以简化代码书写,提高代码可读性。
1 | //进行柯里化 |