JavaScript系列:函数式编程(开篇)

时间:2021-04-30 00:23:54
前言:

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

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

      学习过C++,java这些面向对象编程语言,我们大概都知道面向对象编程就是把目标问题分成几个部分,实现各部分的功能,再组合成一个更强大的对象。虽说JavaScript不是面向对象编程语言(虽然ES6已经出现了Class类这种对象,在此暂且不说),但它却是一种完完全全支持函数式编程的语言,利用函数式编程,我们也可以将问题分解成几个部分(函数)来解决。函数式编程也通过组合其他函数构造更加强大的函数,以实现更抽象的行为。
 
  1. 以函数为抽象单元
  • 比如,我们想自定义打印错误,我们可以将错误,警告等等概念抽象为一个函数
     function fail(err){
    throw new Error(err);
    }
    function warn(err){
    console.log("Warning thing:%s",err);
    }
  • 封装和隐藏
    • 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

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

  • 以函数为行为单位
    • 提供一种简单的存储和传递行为的离散单元
    • 举一个简单的例子:数组索引行为,称之为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];
      }

      JavaScript系列:函数式编程(开篇)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    随机推荐

    1. HOLOLENS程序发布,这个界面调用的图片

      SplashScreen.scale-200.png 1240 x 600

    2. jquey on

      1.如果你的元素是用clone方法复制出来的,并且,用了on来绑定事件的话,必须在clone的后边添加true,负责你的事件不会生效. 2.必须在on $('.js-liubody').on('cli ...

    3. 关于shape&lowbar;trans &lpar;ConnectedRegions&comma; ConvexRegions&comma; &&num;39&semi;convex&&num;39&semi;&rpar;的作用于对比

      * crystal.hdev: extraction of hexagonally shaped crystals via local thresholding and region post-pro ...

    4. C&num; WebApi 上传文件

      本文转载自:http://www.cnblogs.com/zj1111184556/p/3494502.html public class FileUploadController : ApiCont ...

    5. C&num;获取文件的绝对路径

      要在c#中获取路径有好多方法,一般常用的有以下五种: //获取应用程序的当前工作目录. String path1 = System.IO.Directory.GetCurrentDirectory() ...

    6. Uploadify 笔记分享 -- 2014年10月18日

      最近要做一个项目,有个部分需要用到Uploadify,以前用过,但不是很懂,找了无数遍的中文文档,发现好多都是以前的,都不能用,一时间索性自己写了个笔记,随用随查 <form> <i ...

    7. fragment滑动界面

      1.代码页面 package com.example.fragment_list_copy; import android.app.FragmentManager;import android.sup ...

    8. js 原生图片上传

      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

    9. php 数组去重

      php 数组去重 数组中重复项的去除 2010-07-28 15:29 一维数组的重复项: 使用array_unique函数即可,使用实例如下: <?php                    ...

    10. yum与rmp

      清理一切缓存[root@geust02 ~]# yum   clean  all  重建元数据[root@geust02 ~]# yum  makecache 查询vim相关的软件包[root@geu ...