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

糊涂一点web      2022-02-09     499

关键词:

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

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

好处:

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

基本函数式编程:

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

//一般写法
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面试:何为函数式编程?(代码片段)

函数式编程在JavaScript领域着实已经成为一个热门话题。就在几年前,很多JavaScript程序员甚至都不知道啥是函数式编程,但是就在近三年里我看到过的每一个大型应用的代码库中都包含了函数式编程思想的大规模使用。函数式编... 查看详情

Javascript 是函数式编程语言吗?

】Javascript是函数式编程语言吗?【英文标题】:IsJavascriptaFunctionalProgrammingLanguage?【发布时间】:2011-04-2703:08:08【问题描述】:仅仅因为函数是一等对象,有闭包和更高阶的函数,Javascript是否应该被称为函数式编程语言?我认为... 查看详情

你真的理解函数式编程吗?

你真的理解函数式编程吗? 大数据以及人工智能越来越流程,你是否可以轻松适应大数据编程,函数式编程在其中起着重要作用,如何从面向对象编程跳槽到函数式编程?你是否觉得函数式各种概念难于理解?本场Chat将为... 查看详情

javascript系列:模块化与链式编程

模块化:闭包和和函数作用域(JS没有块级作用域ES6之前)构造模块1varman=function(){2varage=12;3return{4getYear:function(){5returnage;6},7setYear:function(n){8age=n;9}10}11}1213varpeter=man();14document.write(peter.getYear());//1215 查看详情

rust编程语言入门之函数式语言特性:-迭代器和闭包(代码片段)

函数式语言特性:-迭代器和闭包本章内容闭包(closures)迭代器(iterators)优化改善12章的实例项目讨论闭包和迭代器的运行时性能一、闭包(1)-使用闭包创建抽象行为什么是闭包(closure)闭包:可以捕获其所在环境的匿名函数... 查看详情

javascript初阶--------函数闭包立即执行函数

 函数     有时候我们的代码重复了很多次,编程里面称为耦合,但是编程要讲究高内聚,弱耦合。为了将重复多的聚在一起就出现了函数。定义    函数基本要素:函数声明(function),函数名称,参数(形参,实... 查看详情

前端学习之函数式编程—闭包(代码片段)

闭包Part01闭包的概念闭包(closure):函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包. 可以在另一个作用域中调用一个函数的内部函数并访问到该函数作用域中的成员//函数作为返回值functionmakeFn()letmsg='hellofunction'... 查看详情

kotlin函数式编程①(函数式编程简介|高阶函数|函数类别|transform变换函数|过滤函数|合并函数|map变换函数|flatmap变换函数)(代码片段)

...动端开发与前端开发使用的技术趋于相同,在前端开发ES6(JavaScript标准ECMAScript6.0)中,也使用函数式编程;二、函数类别函数式编程中涉及到三种函数类别:变换Transform过滤Filter合并Combine在函数式编 查看详情

链式逻辑运算符分配到函数式编程

】链式逻辑运算符分配到函数式编程【英文标题】:Chainedlogicaloperatoronasigmenttofunctionalprogramming【发布时间】:2022-01-1406:28:24【问题描述】:我正在尝试处理几个选项来以最干净的方式填充变量内容。最简单的情况是:constvalue=foo... 查看详情

《javascript函数式编程思想》——名称

第1章 名称一般对函数式编程的介绍都会从一等值和纯函数等概念开始,本书却准备在那之前先花些篇章讨论两个通常未得到足够重视的主题:名称和类型系统。前者包括名称绑定、作用域和闭包等内容,后者包括类... 查看详情

函数式编程:地图是顺序的吗?对闭包的影响

】函数式编程:地图是顺序的吗?对闭包的影响【英文标题】:FunctionalProgramming:Aremapssequential?Implicationsforclosures【发布时间】:2016-11-2516:42:48【问题描述】:我将与Julia一起说明:假设我有一个函数counter()是一个闭包。functionmycl(... 查看详情

函数式编程,闭包,作用域,全局变量

functiongenerateClosure(){varcount=0;varget=function(){return++count;}returnget;}varcounter=generateClosure();console.log(counter());//1console.log(counter());//2console.log(counter());//3一个函数返回它内部定义的 查看详情

java链式编程/级联式编程(代码片段)

链式编程,也叫级联式编程,调用对象的函数时返回一个this对象指向对象本身,达到链式效果,可以级联调用。链式编程:通过高阶函数以点为连接将多个函数连接在一起完成参数传递和复杂的操作!通... 查看详情

java链式编程/级联式编程(代码片段)

链式编程,也叫级联式编程,调用对象的函数时返回一个this对象指向对象本身,达到链式效果,可以级联调用。链式编程:通过高阶函数以点为连接将多个函数连接在一起完成参数传递和复杂的操作!通... 查看详情

javascript语言核心--高阶函数及闭包

标记及清除的内存管理方案解决了循环引用带来的内存泄漏倾向于认为"闭包"是保存保存变量的作用域在嵌套函数定义中,引用了外层函数的变量,此时闭包才会出现(结合Chrome devptools查看)立即执行表达式配合闭包创建私有... 查看详情

从延迟处理讲起,javascript也能惰性编程?

前文回顾​​#✨从历史讲起,JavaScript基因里写着函数式编程​​​​#✨从柯里化讲起,一网打尽JavaScript重要的高阶函数​​​​#✨从纯函数讲起,一窥最深刻的函子Monad​​我们从闭包起源开始、再到百变柯里化等一票高阶... 查看详情

kotlin学习笔记之闭包(代码片段)

闭包,函数式编程福音先了解函数式编程(FunctionalProgramming)概念:它属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。函数式编程语言最重要的基础是λ运算(Lambda表... 查看详情

kotlin学习笔记之闭包(代码片段)

闭包,函数式编程福音先了解函数式编程(FunctionalProgramming)概念:它属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。函数式编程语言最重要的基础是λ运算(Lambda表... 查看详情