《Javascript函数式编程 PDF》

# csdn下载地址
http://download.csdn.net/detail/tssxm/9713727

Underscore

# github
https://github.com/jashkenas/underscore # 中文官方网站
http://www.css88.com/doc/underscore/ # CDN
<script src="https://cdn.bootcss.com/underscore.js/1.8.3/underscore-min.js"></script>

理论篇

什么是函数式编程?

“将值转化成抽象函数” —— 这是一种简单的解释,并且大部分情况也都遵循这个原则。

什么是抽象函数?

抽象函数指的是隐藏了实现细节、隐藏数据和行为的函数。

这种思路和面向对象中的“封装”思路一样,尽管他们在实践中是不同的。

什么是Applicative编程?

函数A作为参数提供给函数B,典型的例子就是UnderScore库中的_.map,_.reduce和_.filter。

什么是高阶函数?

以一个函数作为参数,并且返回另一个函数

为什么要学习函数式编程?

它可以帮助我们简化自己的库和应用程序,并且帮助简化Javascript的复杂度

它使我们放弃很多旧的思维习惯,并从一些面向对象的思想中逐渐退出,打造出一种全新的代码思维

如果你熟悉面向对象编程,那么你会同意它的主要目标是将问题分解成多个部件/对象。但当这些部件/对象被重新聚集组合在一起时,会成为更大的部件、在一个面向对象系统的内部,我们会发现对象间的交互会引起各个对象内部状态的变化,而整个系统的状态转变则是由许许多多小的、细微的状态变化混合形成的。这种无形的“变化网”时不时会因为它而感到困惑。当需要了解其带来的微妙且广泛的状态变化时,这种困惑就会成为一个问题。

函数式编程同样会将一个问题分成几个部分(函数)来解决。与面向对象中将问题分解成多组对象不同,函数式编程将相同的问题分解成多组函数。与面向对象编程类似的是,函数式编程也通过组合其他函数的方式来构建更大的函数,以实现更加抽象的行为。
相比之下,函数式系统努力减少可见的状态修改。因此,如果说要向一个遵循函数式原则的系统中,添加新的功能,就可以理解为:
如何在局限的上下文环境中,开发新的函数无破坏性的进行数据转换(原始数据永不发生变化) 然而,函数式编程和面向对象风格并不应该是对立关系。

函数式编程初试 :一个返回函数的函数

所有的javascript函数都有内置一个 apply 方法。
它使得我们可以用一个数组作为参数来执行一个函数。数组的元素会作为函数的参数。

// apply 示例代码
function splat (func) {
return function (array) {
return func.apply(null,array);
}
} var addArrayElements = splat(function(x,y,z){return x + y + z}); addArrayElements([1,2,3]); // 6

另一个与apply相似的方法:call , 该方法则是直接将参数逐一传递给函数

尽管如此,我们也不可能在使用call时采取这种代码方式:func.call(null,1,2,3,4,5,6,7...); 这样实在太冗余了。(除非传入的参数只有1、2个那就随意~)

每个javascript函数都可以访问一个名为 arguments 的局部对象。它会以对象的形式存储调用本函数时所传递的所有参数。

所以,正确的call使用套路应该是:func.call(null,_.toArray(arguments));

事实上,不仅call如此,我们知道apply本身也是接受一个array参数,所以当apply也要使用arguments时,同样也是这个套路:

func.apply(null,_.toArray(arguments));

// 页面动态插入underscore类库的cdn地址
o = document.createElement('script');
o.src = "https://cdn.bootcss.com/underscore.js/1.8.3/underscore-min.js";
document.documentElement.childNodes[0].appendChild(o);

// call 示例代码
function unsplat (func) {
return function () {
// 注意 :内置的 arguments 变量本质是一个对象类型,而 join 方法只能对数组使用,否则会报错。
// 所以需要使用Underscore工具库的_.toArray方法将其转化为数组类型才可以正常使用,当然你可以使用其他方式转换.
return func.call(null,_.toArray(arguments));
}
} var test = unsplat(function(arr){
return arr.join(' ');
}); test(1,2,3,4,5,6,7); //"1 2 3 4 5 6 7"

apply 与 call 仅仅只是实现函数式编程的其中一种方法而已。

Underscore 示例

Underscore 提供了一套漂亮实用的函数式风格API。可以让我们更加轻易的实现函数式编程

在这一章中我会尽可能列举该库常用的方法以及使用示例

javascript - Underscore 与 函数式编程的更多相关文章

  1. 给 JavaScript 开发者讲讲函数式编程

    本文译自:Functional Programming for JavaScript People 和大多数人一样,我在几个月前听到了很多关于函数式编程的东西,不过并没有更深入的了解.于我而言,可能只 ...

  2. 通过代数,数字,欧几里得平面和分形讨论JavaScript中的函数式编程

    本文是对函数式编程范式的系列文章从而拉开了与以下延续一个. 介绍 在JavaScript中,函数只是对象.因此,可以构造函数,作为参数传递,从函数返回或分配给变量.因此,JavaScript具有一流的 ...

  3. JavaScript系列:函数式编程(开篇)

    前言: 上一篇介绍了 函数回调,高阶函数以及函数柯里化等高级函数应用,同时,因为正在学习JavaScript·函数式编程,想整理一下函数式编程中,对于我们日常比较有用的部分. 为什么函数式编程很重要? ...

  4. [置顶] Ruby,Scala和JavaScript中的函数式编程(一)

    函数式编程(英语:Functional programming)或者函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象.函数编程语言最重要的 ...

  5. 翻译连载 | 第 11 章:融会贯通 -《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  6. 快速入门函数式编程——以Javascript为例

    函数式编程是在不改变状态和数据的情况下使用表达式和函数来编写程序的一种编程范式.通过遵守这种范式,我们能够编写更清晰易懂.更能抵御bug的代码.这是通过避免使用流控制语句(for.while.brea ...

  7. JavaScript中函数式编程中文翻译

    JavaScript 中的函数式编程 原著由 Dan Mantyla 编写 近几年来,随着 Haskell.Scala.Clojure 等学院派原生支持函数式编程的偏门语言越来越受到关注,同时主流的 ...

  8. JavaScript与函数式编程

    JavaScript与函数式编程 绝大多数编程语言都会有函数的概念(或者说所有的?我不太确定),他们都可以做出类似的操作: function(x) { return x * x } 但是Javascr ...

  9. 拥抱函数式编程 I - 基本概念

    函数编程与命令性编程 为支持使用纯函数方法解决问题,特此创建了函数编程范例. 函数编程是一种声明性编程形式.相比之下,大多数主流语言,包括面向对象的编程 (OOP) 语言(如 C#.Visual Ba ...

随机推荐

  1. noi 题库1.7字符串 第16至20题

    16:忽略大小写的字符串比较 一般我们用strcmp可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止.如果全部字符 ...

  2. tomcat安装规范

    创建用户 useradd -u 501 tomcat passwd tomcat tomcat安装 tar zxf apache-tomcat-8.5.5.tar.gz -C /usr/local/ ...

  3. 【树链剖分】【分块】【最近公共祖先】【块状树】bzoj1984 月下“毛景树”

    裸题,但是因为权在边上,所以要先把边权放到这条边的子节点上,然后进行链更新/查询的时候不能更新/查询其lca. #include<cstdio> #include<cmath> ...

  4. 【R笔记】R语言利器之ddply

    ddply()函数位于plyr包,用于对data.frame进行分组统计,与tapply有些类似 准备数据 # 使用stringsAsFactors=F来防止data.frame把向量转为factor ...

  5. ListView控件(下)简单适配器

    (一) 1.效果图 2.activiy_main.xml <?xml version="1.0" encoding="utf-8"?> <Li ...

  6. Mysql主要索引方式:FULLTEXT,HASH,BTREE,RTREE。

    使用方式 CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL ...

  7. IntelliJ IDEA控制台输出中文乱码问题解决

    如果还不行,那么再极端的设置,在IDEA启动的时候强制设置为UTF-8: 打开增加-Dfile.encoding=UTF-8,重启Intellij IDEA 再或者直接在项目运行的时候加入UTF-8的 ...

  8. 多IDC GSLB的部署 - ADC技术博客 - 51CTO技术博客

    多IDC GSLB的部署 - ADC技术博客 - 51CTO技术博客 A10

  9. Instant Run 的操作影响到了代码,导致Android App启动闪退的问题

    转自yuhc163原文android启动应用java.lang.NoClassDefFoundError: Class not found using the boot class loader; n ...

  10. 基本的Bootstrap模板

    <!DOCTYPE html> <html> <html lang="zh-cn"> <meta charset="UTF-8& ...