前言:

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

为什么函数式编程很重要?

      学习过C++,java这些面向对象编程语言,我们大概都知道面向对象编程就是把目标问题分成几个部分,实现各部分的功能,再组合成一个更强大的对象。虽说JavaScript不是面向对象编程语言(虽然ES6已经出现了Class类这种对象,在此暂且不说),但它却是一种完完全全支持函数式编程的语言,利用函数式编程,我们也可以将问题分解成几个部分(函数)来解决。函数式编程也通过组合其他函数构造更加强大的函数,以实现更抽象的行为。
 
  1. 以函数为抽象单元
    • 比如,我们想自定义打印错误,我们可以将错误,警告等等概念抽象为一个函数

       function fail(err){
      throw new Error(err);
      }
      function warn(err){
      console.log("Warning thing:%s",err);
      }
  2. 封装和隐藏
    • Javascript中没有提供直接隐藏数据的方式(也就是没有私有变量),但是可以使用闭包来实现隐藏数据(实现私有变量的定义)

       var Person=function(){
      // 定义私有变量
      var school="SCUT";
      // 定义公共接口方法
      return {
      name:'',
      setName:function(name){
      this.name=name;
      },
      getName:function(){
      return this.name;
      },
      getSchool:function(){
      return school;
      }
      }
      }
      var person1=new Person()
      // => undefined
      person1.school
      // => undefined
      person1.getSchool()
      // => "SCUT"
       var Person=function(){
      this.name='';
      this.school="SCUT";
      this.setName=function(name){
      this.name=name;
      };
      this.getName=function(){
      return this.name;
      };
      this.getSchool=function(){
      return this.school;
      }
      }
      var person1=new Person()
      person1.getSchool()
      //=> "SCUT"
      person1.school
      //=> "SCUT"
      person1.school='JYYz'
      person1.getSchool()
      //=> "JYYz"
      由第一个例子我们可以看到 school 相当于私有变量,无法通过实例访问

       person1.school
      // => undefined

      而第二个例子可以访问,并且可以进行修改。

  3. 以函数为行为单位
    • 提供一种简单的存储和传递行为的离散单元
    • 举一个简单的例子:数组索引行为,称之为nth,简单如下
       nativeNth('hello',2)
      //=> "l"
      nativeNth({},2)
      //=> undefined
      可以看到,当传入不正确的值时候,会发生错误;对之进行修改如下:
      function nativeNth(a,index){
      if(!Number.isInteger(index)) fail("Expected a number as the index");
      if(!Array.isArray(a) && typeof a !=='string')
      fail("Non supported on non-indexed type");
      if((index<0)||(index>a.length-1))
      fail("index value is out of bounds");
      return a[index];
      }

       这样子我们构建了nth函数的抽象方式
       
      总结:概括的说,函数式编程包括以下几点:
      确定抽象,并为其构建函数
      利用已有的函数来构建更为复杂的抽象
      通过已有的函数传给其他的函数来构建更加复杂的抽象
       
      通过函数,我们可以把各部分功能封装在各个抽象里面,提供一个接口,实现逻辑的独立性。

JavaScript系列:函数式编程(开篇)的更多相关文章

  1. 翻译连载 | 第 9 章:递归(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

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

  2. 翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 引言&前言

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 译者团队(排名不分先后):阿希.blueken.brucec ...

  3. 翻译连载 | 第 10 章:异步的函数式(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

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

  4. 翻译连载 | 第 10 章:异步的函数式(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

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

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

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

  6. 翻译连载 | 附录 A:Transducing(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

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

  7. 翻译连载 | 附录 A:Transducing(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

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

  8. 翻译连载 | 附录 B: 谦虚的 Monad-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

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

  9. 翻译连载 | 附录 C:函数式编程函数库-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

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

  10. 全本 | iKcamp翻译 | 《JavaScript 轻量级函数式编程》|《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson - <You-Dont-Know-JS>作者 译者团队(排名不分先后):阿希.blueken.bruc ...

随机推荐

  1. vmware中设置ubuntu静态ip

    概括一下过程中遇到的三个问题: 1.如何修改虚拟机为静态ip并且生效 2.设置完静态ip后,无法上网 3.设置完静态ip且能上网后,宿主机无法ping通虚拟机 问题1:参考https://www.ji ...

  2. bzoj 1085骑士精神

    bzoj 1085骑士精神 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士,且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2 ...

  3. HDU 1018 Big Number 斯特林公式

    Big Number 题意:算n!的位数. 题解:对于一个数来算位数我们一般都是用while去进行计算,但是n!这个数太大了,我们做不到先算出来在去用while算位数. while(a){ cnt++ ...

  4. hdu 6092 Rikka with Subset(多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6092 #include <cstdio> #include <iostream> ...

  5. JOBDU 1193 矩阵转置

    啊!!!这道题目今天竟然写错了!!!这道题目巨坑,说不能用数组,结果竟然是用数组做的,吐血!!! 看的所有有关博文,都是用数组做的,晕倒!真的出题人有毛病,出这种题,又不限制运行!!! 以后再遇到这种 ...

  6. CF - 652F Ants on a Circle

    题目传送门 题解: 先观察蚂蚁相撞, 可以发现, 如果我们将相撞的2个蚂蚁互换位置的话,蚂蚁相当于没有碰撞体积,直接穿过去了.所以我们可以直接计算出最终哪些位置上会有蚂蚁. 接下来就需要知道蚂蚁们的最 ...

  7. QRowTable表格控件(五)-重写表头排序、支持第三次单击恢复默认排序

    目录 一.原生表格 二.效果展示 三.实现方式 1.排序列定制 2.排序交互修改 四.相关文章 原文链接:QRowTable表格控件(五)-重写表头排序.支持第三次单击恢复默认排序 一.原生表格 开发 ...

  8. composer 依赖的require安装与remove删除命令

    安装:require composer require phpmailer/phpmailer 删除:remove composer remove phpmailer/phpmailer

  9. Linux 笔记 - 第四章 Linux 文件和目录管理

    博客地址:http://www.moonxy.com 1. 绝对路径和相对路径 绝对路径:由根目录 "/" 写起的.如:/usr/local/mysql 相对路径:不是由根目录 & ...

  10. caffe学习一:ubuntu16.04下跑Faster R-CNN demo (基于caffe). (亲测有效,记录经历两天的吐血经历)

    兜兜转转,兜兜转转; 一次有一次,这次终于把Faster R-CNN 跑通了. 重要提示1:在开始跑Faster R-CNN之前一定要搞清楚用的是Python2 还是Python3. 不然你会无限次陷 ...