欢迎指导与讨论:)

  前言

    函数式编程能使我们的代码结构变得简洁,让代码更接近于自然语言,易于理解。

  一、减少不必要的函数嵌套代码

    (1)当存在函数嵌套时,若内层函数的参数与外层函数的参数一致时,可以这样子写。

// 一个内层函数
function call( num, index ){
console.log (num + ' ' + index );
} // 啰嗦的写法
[ 1, 2, 3 ].map(function( num, index ){
return call( num, index );
}) // 简洁的写法
[ 1, 2, 3 ].map( call );

    (2)当存在函数嵌套时,若内层函数的参数与外层函数的参数一致时,可以这样子写。

// 啰嗦的写法
var app = (function( ){
var init = function( name, value ){
Db.init( name, value);
}
return { init: init }
})( ) // 简洁的写法
var app = { init: Db.init }

    (3)小结,这种写法主要依靠于,函数发生嵌套时,内外函数所接受的参数时一致。并且这种写法从可读性上看,是忽略了参数传递的过程。

  二、尽量使用纯函数 —— 让副作用在可控范围内发生

    纯函数是一类,只要输入相同,每次必能返回相同输出的一类函数。它要求:尽可能不与与函数体外的变量打交道,让结果尽可能与函数体外的任何变量无关,函数不影响输入的数据等等。另外,基于纯函数,能够使用缓存,实现尽可能少的复杂运算 —— react reselect就是一个例子。同时也能提高函数的可测试性。

    (1)尽可能地不影响原有数据

// 原数据
var xs = [1,2,3,4,5]; // 纯的
xs.slice(0,3); // 不纯的
xs.splice(0,3);

    (2)使结果尽可能和函数体外部变量无关

// 不纯的
var minimum = 21;
var checkAge = function(age) {
return age >= minimum;
}; // 纯的
var checkAge = function(age, minimum ) {return age >= minimum;
};

 

  三、柯里化 —— 动态创建新函数

    柯里化是动态地创建函数的一种写法,让函数先处理一部分逻辑,然后再让函数体内再次返回一个函数,达到函数配置惰性求值的效果。结合闭包,能实现良好的封装效果。

    同时,柯里化也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果。因此柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程。

    (1)使用柯里化,进行函数的创建与配置
function testRegEx( RegEx ) {
// 先进行配置
var regEx = RegEx;
// 惰性求值,返回函数引用
return function( string ) {
return regEx.test( string );
}
} // 使用方法:
testRegEx( /hello/g )('Ben said hello!') // 返回true
// 另一种使用方法:
var hasHello = testRegEx(/hello/g);
hasHello('Ben said hello!') // 返回true

    (2)使用柯里化,返回实用的接口

function append ( parent,child ){
parent.appendChild( child );
return function( ){
child.remove( );
}
} // 使用:
var remove = append( node1, node2 );
// 调用返回的函数
remove( );

  四、函数组合 —— 更佳的可读性

    顾名思义,组合函数是将多个函数进行组合成一个函数。通过自定义函数组合函数的compose,可以提高一定的函数嵌套可读性。当数据需要从一层层的函数流经时(Pipe管道),我们推荐使用函数组合,来提高可读性。

    (1)自定义函数组合函数

// 建立一个,从右至左,管道式的函数组合 函数
var compose = function( ...list ) {
var last = list[ list.length -1 ];
var rest = list.slice( 0, -1 );
return ( ...args ) => rest.reduceRight(( preValue, currentFunc) => currentFunc( preValue ), last( ...args))
} // 使用方法:
// 加感叹号
var exclaim = ( x ) => x + '!!!!';
// 变大写
var upperCase = ( x ) => x.toUpperCase( );
// 加其他符号
var other= ( x ) => x + '@@@';
// 函数组合 ------> 函数从右往左地执行,函数执行过程的可读性非常高
var last = compose( other, upperCase, exclaim);
last('hello')
// 返回: HELLO!!!!@@@

   五、函数声明式 

    与平时需要时刻关心所有细节的命令式编程相比,函数声明式会让我们轻松一些,因为它没有"先做这个,再做那个"的命令式代码,而是转为"我需要什么样的数据"的表达式,前者是表达怎么做,后者是表达做什么。同时,函数声明式也能让代码更加优雅。

    (1)一个函数声明式例子

// 命令式
var makes = [];
for (i = 0; i < cars.length; i++) {
makes.push(cars[i].make);
} // 声明式
var makes = cars.map(function(car){ return car.make; });

[学习笔记]JavaScript之函数式编程的更多相关文章

  1. Python学习笔记二:函数式编程

    1:Python中,内置函数名相当于一个变量,指向内置函数.所以可以通过函数名调用相应函数,也可以给函数名赋值,改变它的内容,如:可以把另一个函数变量赋值给它,那它就指向了所赋值的函数了. 2:高级函 ...

  2. #学习笔记#——JavaScript 数组部分编程(一)

    来自牛客网的js编程题 1.移除数组 arr 中的所有值与 item 相等的元素.不要直接修改数组 arr,结果返回新的数组 function remove(arr, item) { if(!Arra ...

  3. #学习笔记#——JavaScript 数组部分编程(七)

    24.柯里化 首先想解释一下,“柯里化”的意思, [在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结 ...

  4. #学习笔记#——JavaScript 数组部分编程(六)

    14. 题目描述 实现一个打点计时器,要求 1.从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1 2.返回的对象中需 ...

  5. #学习笔记#——JavaScript 数组部分编程(五)

    11.为数组 arr 中的每个元素求二次方.不要直接修改数组 arr,结果返回新的数组 function square(arr) { var resultArr=new Array(); for(va ...

  6. #学习笔记#——JavaScript 数组部分编程(四)

    7.合并数组 arr1 和数组 arr2.不要直接修改数组 arr,结果返回新的数组 function concat(arr1, arr2) { return arr1.concat(arr2); } ...

  7. #学习笔记#——JavaScript 数组部分编程(三)

    3.在数组 arr 末尾添加元素 item.不要直接修改数组 arr,结果返回新的数组 主要考察数组的concat方法,代码如下: arr.concat(item); concat 方法不修改原数组. ...

  8. #学习笔记#——JavaScript 数组部分编程(二)

    2.移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回 function removeWithoutCopy(arr, item) { if(!A ...

  9. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

  2. Visual Studio Code 代理设置

    Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...

  3. Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  4. Android Ormlite 学习笔记2 -- 主外键关系

    以上一篇为例子,进行主外键的查询 定义Users.java 和 Role.java Users -- Role 关系为:1对1 即父表关系 Role -- Users 关系为:1对多 即子表关系 下面 ...

  5. Javascript正则对象方法与字符串正则方法总结

    正则对象 var reg = new Regexp('abc','gi') var reg = /abc/ig 正则方法 test方法(测试某个字符串是否匹配) var str = 'abc123'; ...

  6. LVM基本介绍与常用命令

    一.LVM介绍LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制LVM - 优点:LVM通常用于装备大量磁盘的系统,但它同样适 ...

  7. nginx安装

    nginx工作模式-->1个master+n个worker进程 安装nginx的所需pcre库[用于支持rewrite模块] 下载软件方法: 搜索 pcre  download 网址:http: ...

  8. mono for android学习过程系列教程(4)

    今天要讲的事情是构建安卓程序的UI界面. 首先给大家上点小点心,如图: 上面就是我们界面的设计模块,仔细看中间大块的下方,有一个Source,这就类似webform里面的设计和源代码界面. 在这个页面 ...

  9. 分布式存储 CentOS6.5虚拟机环境搭建FastDFS-5.0.5集群

    前言:       由于公司项目需要,最近开始学习一下分布式存储相关知识,确定使用FastDFS这个开源工具.利用周末的时间在虚拟机上搭建了分布式存储系统,在搭建过程中,发现网上的资料说的并不是很全, ...

  10. 浅析Go语言的Interface机制

    前几日一朋友在学GO,问了我一些interface机制的问题.试着解释发现自己也不是太清楚,所以今天下午特意查了资料和阅读GO的源码(基于go1.4),整理出了此文.如果有错误的地方还望指正. GO语 ...