《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. disabling IPv6 name/address support: Address family not supported by protocol

    禁用IPv6 后影响邮件发送设置 vim /etc/postfix/main.cf # Enable IPv4, and IPv6 if supported inet_protocols = all

  2. [CTSC2017]最长上升自序列(伪题解)(Dilworth's theorem+网络流)

    部分分做法很多,但每想出来一个也就多5-10分.正解还不会,下面是各种部分分做法: Subtask 1:k=1 LCS长度最长为1,也就是说不存在j>i和a[j]>a[i]同时成立.显然就 ...

  3. 【最小割】【Dinic】bzoj3275 Number

    每个点拆点,分别向源/汇连a[i]的边,满足条件的相互连INF的边,答案为sum-maxflow*2. 因为若有几个点不能同时被选,我们要贪心地选择其中和尽量大的部分,这可以由最小割来保证. #inc ...

  4. 摄氏度和华氏度之间的额转换 Exercise06_08

    /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:摄氏度和华氏度之间的额转换 * */ public class Exercise06_08 { public static v ...

  5. HashMap源码-使用说明部分

    /* * Implementation notes. * 使用说明 * * This map usually acts as a binned (bucketed) hash table, but * ...

  6. Matlab图形中输入希腊字母

    xlabel('\beta'); ylabel('\delta'); 希腊字母等特殊字符用 \加拼音 如: α \alpha β \beta γ \gamma θ \theta Θ \Theta Г ...

  7. zip压缩与解压文件夹或文件

    import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import ...

  8. Android 中 Environment.getExternalStorageDirectory()无效

    我们在处理缓存的时候,并不是每次都会在应用私有存储空间那里保存,很多时候是需要用到ExternalStorage.我们平时一般都是用Environment.getExternalStorageDire ...

  9. Oracle Service Bus Socket Adapter调整的参数

    之前在一个客户中做压力测试时候Oracle Service Bus性能大概达到900tps左右,和客户期望的1600tps有很大差距. 在研究了Socket Adapter的工作原理之后,判断可能是O ...

  10. 快速打开IIS的方法

    方法一: 在运行(win+r)输入inetmgr 方法二: 控制面板\所有控制面板项\管理工具\IIS 建议使用第一种方法