《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. python 面向对象(成员,静态,类)的(变量,方法)区别

    静态方法是使用@staticmethod装饰的方法,并且参数表中不需要self或者cls,可以访问类成员变量 默认的方法是有self的,是成员方法,可以访问私有变量和方法(通过self.xxx),或者 ...

  2. Codeforces Round #209 (Div. 2) D. Pair of Numbers (模拟)

    D. Pair of Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. Eclipse 教程 | 菜鸟教程

    http://www.runoob.com/eclipse/eclipse-charset.html

  4. Java中应用多线程的场景?

    最典型的应用比如tomcat,tomcat内部采用的就是多线程,上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程 ...

  5. [BZOJ 4033] 树上染色

    Link: BZOJ 4033 传送门 Solution: 此题用到了计算贡献的方法, 将 多条路径的路径和  $->$ $\sum_{i=1}^{n-1} w[i]*cnt[i]$ 这样我们由 ...

  6. [Contest20180328]同构

    我们先把两棵树的所有节点的儿子排序,然后dfs,记录访问的深度序列 然后可以发现题目中的两个操作都只会在深度序列中删掉一位,不会对其他位有影响(自己画画图就知道了) 对于一个深度序列$d_{1\cdo ...

  7. 【MySQL笔记】MySql5安装图解教程

    MySql5.6Window超详细安装教程 2015-06-23      0个评论    来源:林炳文Evankaka的专栏   收藏    我要投稿 一.安装包准备 1.下载MySql5.6 ht ...

  8. Mybatis更新用户

    xml配置 <!--更新用户 --> <update id="updateUserById" parameterType="com.itheima.my ...

  9. yum出现的“UnicodeDecodeError: 'ascii' codec”问题解决

    新装了CentOS 6.5系统,打算使用yum安装程序是出现了如下错误: Loading mirror speeds from cached hostfile Traceback (most rece ...

  10. React Native Navigator组件回调

    在push的时候定义回调函数: this.props.navigator.push({ component: nextVC, title: titleName, passProps: { //回调 g ...