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,未完待续、、、

时间: 2024-11-03 21:18:20

javaScript函数式编程-包含闭包、链式优化及柯里化的相关文章

Effective JavaScript Item 26 使用bind来进行函数的柯里化(Curry)

本系列作为Effective JavaScript的读书笔记. 在上一个Item中介绍了bind的一种用法:用来绑定this对象.但是实际上,bind含有另一种用法,就是帮助函数进行柯里化.关于柯里化,这里有一份百科可以参考: http://zh.wikipedia.org/wiki/%E6%9F%AF%E9%87%8C%E5%8C%96 但是实际上,关于柯里化只需要记住一点就够了:柯里化是把接受多个参数的函数变换成接受一个单一参数(通常是最初函数的第一个参数,但是并无限制)的函数,并且返回这个

JavaScript函数式编程(三)

JavaScript函数式编程(一) JavaScript函数式编程(二) 在第二篇文章里,我们介绍了 Maybe.Either.IO 等几种常见的 Functor,或许很多看完第二篇文章的人都会有疑惑: 『这些东西有什么卵用?』 事实上,如果只是为了学习编写函数式.副作用小的代码的话,看完第一篇文章就足够了.第二篇文章和这里的第三篇着重于的是一些函数式理论的实践,是的,这些很难(但并非不可能)应用到实际的生产中,因为很多轮子都已经造好了并且很好用了.比如现在在前端大规模使用的 Promise

JavaScript的柯里化函数

柯里化,或者说部分应用,是一种函数式编程的技术,对于熟悉以传统方式编写 JavaScript 代码的人来说可能会很费解.但如果使用得当,它可以使你的 JavaScript 函数更具可读性. 更具可读性和灵活性 函数式 JavaScript 被吹捧的优点之一就是拥有短小紧凑的代码风格,可以用最少行数.更少重复的代码得到正确的结果.有时这会以牺牲可读性为代价:如果你还不熟悉函数式编程的方法,这种方法写的代码会很难阅读和理解. 如果之前你遇到过柯里化这个术语,但是不知道它是什么意思,把它当做奇怪的.难

JavaScript柯里化

什么是柯里化 柯里化允许我们把函数与传递给它的参数结合,产生一个新的函数.[引自<JavaScript语言精髓>,第43页 柯里化] A function is said to be curried when not all arguments have been supplied to the function, so it returns another function that retains the arguments given and expects the remaining

20170917 前端开发周报:JavaScript函数式编程、作用域和闭包

1.用函数式编程对JavaScript进行断舍离 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!! https://juejin.im/entry/59b86... 2.JavaScript作用域和闭包 作用域和闭包在JavaScript里非常重要.但是在我最初学习JavaScript的时候,却很难理解.这篇文章会用一些例子帮你理解它们.我们先从作用域开始.作用域 JavaScript的作用域限定了你可以访问哪些变量.有两种作

JavaScript函数式编程(1):基本思想

1 函数式编程简介 函数式编程是和传统命令式编程区分的一种编程思想,"在函数式编程语言中,函数是第一类的对象,也就是说,函数 不依赖于任何其他的对象而可以独立存在,而在面向对象的语言中,函数 ( 方法 ) 是依附于对象的,属于对象的一部分.这一点决定了函数在函数式语言中的一些特别的性质,比如作为传出 / 传入参数,作为一个普通的变量等.[1]" 函数式编程思想的源头可以追溯到 20 世纪 30 年代,数学家阿隆左 . 丘奇在进行一项关于问题的可计算性的研究,也就是后来的 lambda

javaScript函数式编程

第1章 JavaScript函数式编程简介 11.1 JavaScript案例 11.2 开始函数式编程 41.2.1 为什么函数式编程很重要 41.2.2 以函数为抽象单元 71.2.3 封装和隐藏 91.2.4 以函数为行为单位 101.2.5 数据抽象 141.2.6 函数式JavaScript初试 171.2.7 加速 191.3 Underscore示例 221.4 总结 23第2章 一等函数与Applicative编程 242.1 函数是一等公民 242.2 Applicative编

Golang-函数式编程(闭包)

github:https://github.com/ZhangzheBJUT/blog/blob/master/closure.md 一 函数式编程概论 在过去近十年时间里,面向对象编程大行其道,以至于在大学的教育里,老师也只会教给我们两种编程模型,面向过程和面向对象.孰不知,在面向对象思想产生之前,函数式编程已经有了数十年的历史.就让我们回顾这个古老又现代的编程模型,看看究竟是什么魔力将这个概念在21世纪的今天再次拉入我们的视野. 随着硬件性能的提升以及编译技术和虚拟机技术的改进,一些曾被性能

javascript函数式编程简单介绍

函数式编程在前端已经成为了一个热门的话题,近几年很多的应用程序代码库里大量使用着函数式编程思想.这里对JavaSctipt中的函数式编程做一个简单介绍. 什么是函数式编程 函数式编程是一种编程范式,主要是利用函数把运算过程封装起来,通过组合各种函数来计算结果.函数式编程意味着开发者可以在更短的时间内编写具有更少错误的代码. 函数式编程的简单例子 假设要把一个字符串转换成每个单词首字母大写,可以这样来实现: var string = 'i do like yanggb'; var result =