首页 > 代码库 > javaScript函数式编程-包含闭包、链式优化及柯里化

javaScript函数式编程-包含闭包、链式优化及柯里化

本文着重介绍个人理解的函数式编程。

函数式编程个人理解为:以函数为主要载体的编程方式。

好处:

  • 语义更加清晰
  • 可复用性高
  • 可维护性好
  • 作用域局限、副作用

基本函数式编程:

//实现数组中每个单词首字母大写

//一般写法
const arr = [‘apple‘,‘orange‘,‘pear‘];
for(const i in arr) {
    const c = arr[i][0];
    arr[i] = c.toUpperCase() + arr[i].slice(1); //slice()从已有的数组中返回选定的元素
}
console.log(arr);

//函数式写法
function upperFirst(word) {
    return word[0].toUpperCase() + word.slice(1);
}

function wordToUpperCase(arr) {
    return arr.map(upperFirst);
}

console.log(wordToUpperCase([‘apple‘,‘orange‘,‘pear‘]));

链式优化

从上面的函数式写法中可以看出有多层嵌套,即很容易产生横向延展。

如:

//计算数字之和

//一般写法
console.log((3 + 4 + 5) * 7);

//函数式写法
function sum(a, b) {
    return a + b;
}
function mul(c, d) {
    return c * d;
}

console.log(mul(sum(sum(3, 4), 5), 7));

这种情况可读性下降,我们可以选择其他可读性更高的方式,比如下面这种链式优化

//优化写法lodash的链式写法
const  utils = {
    chain(a) {
        this._temp = a;
        return this;
    },
    sum(b) {
        this._temp += b;
        return this;
    },
    mul(c) {
        this._temp *= c;
        return c;
    },
    value() {
        const  _temp = this._temp;
        this._temp = undefined;
        return _temp;
    }
};
console.log(utils.chain(3).sum(4).sum(5).mul(7).value());

常见的函数式编程模型

闭包

可以保留局部变量不被释放的代码块,被称为一个闭包

如以下代码创建一个闭包

// 创建一个闭包
function makeCounter() {
    let k = 0;

    return function() {
        return k++;
    };
}

const counter = makeCounter();

console.log(counter());  // 0
console.log(counter());  // 1

闭包的创造条件是:

  1. 存在内、外两层函数
  2. 内层函数对外层函数的局部变量进行了引用

闭包的弊端

持久化变量不会被正常释放,持续占用内存空间,很容易造成内存浪费,所以一般需要一些额外手动的清理机制。

 

个人理解:

  现在暂时没有系统的学习js,只是最近暂时行的接触到函数式编程。

  so,未完待续、、、

javaScript函数式编程-包含闭包、链式优化及柯里化