javascript - Underscore 与 函数式编程

《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>

 

理论篇

 

什么是函数式编程?

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

 

什么是抽象函数?

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

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

 

什么是Applicative编程? 

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

  

什么是高阶函数? 

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

  

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

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

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

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


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

然而,函数式编程和面向对象风格并不应该是对立关系。
View Code

 

 

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

所有的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。可以让我们更加轻易的实现函数式编程

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

 

posted @ 2017-01-26 23:16  贝尔塔猫  阅读(444)  评论(0编辑  收藏  举报