zoukankan      html  css  js  c++  java
  • javascript

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

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

  • 相关阅读:
    linux 查看父进程号
    gitlab
    诺基亚C6常识详解
    C#.net书籍列表
    表链接
    Limu:JavaScript的那些书(转载)
    Oracle 多行记录合并/连接/聚合字符串的几种方法
    关于有锁iPhone的常识(转载)
    not in与not exists性能比较
    多表连接查询
  • 原文地址:https://www.cnblogs.com/CyLee/p/6352214.html
Copyright © 2011-2022 走看看