JS中的一些常用的函数式编程术语
组合 Composition
组合某种类型(含函数)的两个元素,进而生成一个该类型的新元素:
JavaScript
let compose = (f, g) => a => f(g(a)) let toUpperCase = x => x.toUpperCase() let exclaim = x => x + '!' let shout = compose(exclaim, toUpperCase); shout("hello world") // HELLO WORLD!
偏函数应用 Partial Application
一个多参函数,如果我们只提供了部分参数,这种应用就是偏函数应用:
JavaScript
let sum3 = (a, b, c) => a + b + c let partial = sum3.bind(null, 10, 20) partial(30) // 60
柯里化 Currying
把多参数函数处理成 接受一个参数,返回一个接受下一个参数的函数 的形式:
JavaScript
let curryingSum3 = (a) => (b) => (c) => a + b + c let curriedSum3 = curryingSum3(30)(20) // [Function] curriedSum3(10) // 60
注意:柯里化和偏函数应用是不同的,它只接受单参输入;在Haskell这样的纯函数式语言中,只存在柯里化,多参函数是一种语法糖,这样做的好处是为函数组合提供了更灵活的手段, 并且使得接口更为流畅。
副作用 Side Effect
一个函数或表达式如果出现下面情况被认为有副作用:除了返回结果值,还修改了内部状态,或者为外界植入提供了改变内部状态的可能。有副作用的例子:随机数生成器 或者 IO操作 。
document。prototype。getter=function(){get(this)}
幂等 Idempotency
能够多次使用同样的输入参数无副作用地执行多次:
JavaScript
let id = x => x id(id(id(10))) === id(10) // true Math.abs(Math.abs(-1)) === Math.abs(-1) // true
引用透明性 Referential Transparency
一个表达式能够被它的值替换,而不会影响计算结果,这种表达式称为引用透明的。
JavaScript
let greeting = () => 'hello, ' greeting() + 'buddy'
上面的表达式中每次对 greeting() 的调用,都可以被替换为 'hello, ',我们可以断言 greeting()具有引用透明性。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
本文实例讲述了JavaScript函数式编程(Functional Programming)组合函数(Composition)用法.分享给大家供大家参考,具体如下: 组合(Composition)函数,就是把两个或以上的函数组合到一块儿,整成一个新的函数.我找到了一个很好的例子,很好地解释了组合函数这个概念. 比如一个应用主要是记录一下日常的花销(expenses),应用里的数据看起来像这样: const expenses = [ { name: '租金', price: 3000, type:
-
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
本文实例讲述了JavaScript函数式编程(Functional Programming)声明式与命令式.分享给大家供大家参考,具体如下: 函数式编程属于声明式编程(declarative programming)的范畴,经常跟声明式编程一块儿讨论的是命令式编程(imperative programming),因为它们是两种不太一样的风格. 命令式编程一般就是说清楚具体要怎么样得到一个结果:先这样做,再这样做,然后再这样,如果这样,就这样做 - 声明式编程就是声明(说明)一下你想得到的结果是什
-
详解用函数式编程对JavaScript进行断舍离
我和JavaScript 从1997年网景的Navigator 3浏览器开始就开始使用JavaScript.当时,JavaScript还只能做一些很简单的事情.我记得最酷的就是用JavaScript实现mouseover特性,在那个时候已经算得上是高科技了!当鼠标移过去之后,文本内容就神奇的改变了.因为当时都是pre-DHTML,你根本不需要隐藏或则显示DOM元素. 关于DHTML DHTML是Dynamic HTML的简称,就是动态的html(标准通用标记语言下的一个应用),是相对传统的静态的
-
理解javascript函数式编程中的闭包(closure)
闭包(closure)是函数式编程中的概念,出现于 20 世纪 60 年代,最早实现闭包的语言是 Scheme,它是 LISP 的一种方言.之后闭包特性被其他语言广泛吸纳. 闭包的严格定义是"由函数(环境)及其封闭的自由变量组成的集合体."这个定义对于大家来说有些晦涩难懂,所以让我们先通过例子和不那么严格的解释来说明什么是闭包,然后再举例说明一些闭包的经典用途. 什么是闭包 通俗地讲, JavaScript 中每个的函数都是一个闭包,但通常意义上嵌套的函数更能够体 现出闭包的特性,请看
-
js 函数式编程学习笔记
(1)平常写的函数大多是接受值,合并值,返回值,比如经常写的for循环: function printArray(array){ for(var i=0;i<array.length;i++){ print(array[i]); } } 但是如果我们想做print之外的事情呢?怎么办?再写一个相似的,未免显得浪费,我们可以这样 function forEach(array,action){ for(var i=0;i<array.length;i++){ action(array[i]); }
-
JavaScript函数式编程(Functional Programming)纯函数用法分析
本文实例讲述了JavaScript函数式编程(Functional Programming)纯函数用法.分享给大家供大家参考,具体如下: 函数式编程鼓励我们多创建纯函数(pure functions),纯函数只依赖你交给它的东西,不使用任何函数以外的东西,也不会影响到函数以外的东西.跟纯函数对应的就是不纯函数(impure functions),也就是不纯函数可能会使用函数以外的东西,比如使用了一个全局变量.也可能会影响到函数以外的东西,比如改变了一个全局变量的值. 多使用纯属函数是因为它更可靠
-
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
本文实例讲述了JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法.分享给大家供大家参考,具体如下: 箭头函数在 JavaScript 里面,是 ES6(ES2015)才加入进来的.因为函数里有个像箭头一样的符号:=>,所以叫箭头函数,英文经常也会称为 Fat arrow functions,胖乎乎的箭头函数.这种函数也称为 lambda 表达式.箭头函数不能当作构造函数使用. 语法 一个箭头函数看起来像这样: const
-
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
本文实例讲述了JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法.分享给大家供大家参考,具体如下: 高阶函数(higher-order functions),就是返回其它函数的函数,或者使用其它函数作为它的参数的函数. 使用函数作为参数 因为函数本身就是一个值,所以可以让函数作为参数传递给其它的函数.JavaScript 有些函数就需要用到函数类型的参数,比如 Array.map. 比如我有一组数据: con
-
JS中的一些常用的函数式编程术语
组合 Composition 组合某种类型(含函数)的两个元素,进而生成一个该类型的新元素: JavaScript let compose = (f, g) => a => f(g(a)) let toUpperCase = x => x.toUpperCase() let exclaim = x => x + '!' let shout = compose(exclaim, toUpperCase); shout("hello world") // HELLO
-
Node.js中process模块常用的属性和方法
前言 虽然node对操作系统做了很多抽象的工作,但是你还是可以直接和他交互,比如和系统中已经存在的进程进行交互,创建工作子进程.node是一个用于事件循环的线程,但是你可以在这个事件循环之外创建其他的进程(线程)参与工作. 如果不是和命令行工具打交道,可能我们很少有机会去用到process模块中的一些方法或者属性.不过如果你要做类似于webpack或者gulp等较为复杂的构建工具,由于bash界面就是和用户直接交流的工具,因此友好的输入输出,完整的提示都非常有必要了. 属性 一张表格大概可以看到
-
JS函数式编程实现XDM一
盲猜一个:如果你有看过 <medium 五万赞好文-<我永远不懂 JS 闭包>> <“类”设计模式和“原型”设计模式——“复制”和“委托”的差异> 这两篇文章,你一定会对 JS 的[函数]有更多兴趣! 皮一下,很舒服~ 没错!JS 就是轻量级的函数式编程! 拆解一下这句话,品味一下~ 本瓜将借助<JavaScript 轻量级函数式编程>一书带领你先透析它的落脚点函数式编程,然后再看看 JS 为什么被称为是 “轻量的”! 此篇是<JS如何函数式编程>
-
JavaScript的函数式编程基础指南
引言 JavaScript是一种强大的,却被误解的编程语言.一些人喜欢说它是一个面向对象的编程语言,或者它是一个函数式编程语言.另外一些人喜欢说,它不是一个面向对象的编程语言,或者它不是一个函数式编程语言.还有人认为它兼具面向对象语言和函数式语言的特点,或者,认为它既不是面向对象的也不是函数式的,好吧,让我们先搁置那些争论. 让我们假设我们共有这样的一个使命:在JavaScript语言所允许的范围内,尽可能多的使用函数式编程的原则来编写程序. 首先,我们需要清理下脑子里那些关于函数式编程的错误观
-
C#函数式编程中的标准高阶函数详解
何为高阶函数 大家可能对这个名词并不熟悉,但是这个名词所表达的事物却是我们经常使用到的.只要我们的函数的参数能够接收函数,或者函数能够返回函数,当然动态生成的也包括在内.那么我们就将这类函数叫做高阶函数.但是今天我们的标题并不是高阶函数,而是标准高阶函数,既然加上了这个标准,就意味着在函数式编程中有一套标准的函数,便于我们每次调用.而今天我们将会介绍三个标准函数,分别为Map.Filter.Fold. Map 这个函数的作用就是将列表中的每项从A类型转换到B类型,并形成一个新的类型.下面我们可
-
Python3中lambda表达式与函数式编程讲解
简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数.其一般有如下几种使用方式: 1.lambda的一般形式是关键字lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式.lambda是一个表达式而不是一个语句.它能够出现在Python语法不允许def出现的地方.作为表达式,lambda返回一个值(即一个新的函数).lambda用来编写简单的函数,而def用来处理更强大的任务.例如: f = lambda x,y
-
JavaScript中的函数式编程详解
函数式编程 函数式编程是一种编程范式,是一种构建计算机程序结构和元素的风格,它把计算看作是对数学函数的评估,避免了状态的变化和数据的可变,与函数式编程相对的是命令式编程.我们有这样一个需求,给数组的每个数字加一: // 数组每个数字加一, 命令式编程 let arr = [1, 2, 3, 4]; let newArr = []; for(let i = 0; i < arr.length; i++){ newArr.push(arr[i] + 1); } console.log(newArr)
-
JS轻量级函数式编程实现XDM三
目录 前言 组合函数 含义 封装盒子 任意组合 compose 变体 抽象能力 阶段小结 前言 这是[JS如何函数式编程]系列文章第三篇.点赞关注,持续追踪 前两篇传送门: <XDM,JS如何函数式编程?看这就够了!(一)> <XDM,JS如何函数式编程?看这就够了!(二)> 在第二篇,我们谈了基础之基础,重要之重要——“偏函数”,偏函数通过函数封装,实现了减少传参数量的目的,解决了手动指定实参的麻烦. 更具重要意义的是: 当函数只有一个形参时,我们能够比较容易地组合它们.这种单元
-
JS轻量级函数式编程实现XDM二
目录 前言 偏函数 传参现状 封装 partial 运行机制 拓展 partial 柯里化 阶段小结 前言 承接上一篇<XDM,JS如何函数式编程?看这就够了!(一)>,我们知道了函数式编程的几个基本概念. 这里作简要回顾: 函数式编程目的是为了数据流更加明显,从而代码更具可读性: 函数需要一个或多个输入(理想情况下只需一个!)和一个输出,输入输出是显式的代码将更好阅读: 闭包是高阶函数的基础: 警惕匿名函数: 弃用 this 指向: 本篇将着重介绍第 2 点中函数的输入,它是 JS 轻量函数
随机推荐
- 使用ZeroClipboard解决跨浏览器复制到剪贴板的问题
- linux命令详解之挂载光驱的方法
- 详解JavaScript时间处理之几个月前或几个月后的指定日期
- asp.net开发中怎样去突破文件依赖缓存
- JavaScript实现非常简单实用的下拉菜单效果
- PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
- Android 中 Fragment的使用大全
- 文字不间断滚动(上下左右)实例代码
- 字段太多jquey快速清空表单内容方法
- 33个优秀的 jQuery 图片展示插件分享
- jQuery设置div一直在页面顶部显示的方法
- Android开发笔记之Intent初级学习教程
- Android SDK Manager国内无法更新的解决方案
- 浅谈java中String与StringBuffer的不同
- C语言数据结构实现链表去重的实例
- Python语法分析之字符串格式化
- 微信小程序npm引入vant-weapp的踩坑记录
- Android自定义view实现圆的扩散效果
- Python+Pandas 获取数据库并加入DataFrame的实例
- linux下搭建go环境的安装配置讲解