Skip to content
Go back

函数式编程笔记

Posted on:January 5, 2018 at 07:25 PM

过去编程方式主要是以命令式编程为主,什么意思呢?简单说电脑的思维方式和我们人类的思考方式是不一样的。我们人类的大脑擅长的是分析问题,提出一个解决问题的方案,电脑则是生硬的执行指令,命令式编程就像是给电脑下达命令,让电脑去执行一样,现在主要的编程语言(比如:Java,C,C++等)都是由命令式编程构建起来的。 ​ 而函数式编程就不一样了,这是模仿我们人类的思维方式发明出来的。例如:操作某个数组的每一个元素然后返回一个新数组,如果是计算机的思考方式,会这样想:创建一个新数组=>遍历旧数组=>给新数组赋值。如果是人类的思考方式,会这样想:创建一个数组方法,作用在旧数组上,返回新数组。这样此方法可以被重复利用。而这就是函数式编程了。

  1. 高阶函数可以接受函数作为参数,或者返回一个函数结果或者两者同时。
  2. 闭包就是一个函数的作用域,这个作用域通过指向改函数的引用保持存活
  3. 科里化(参数缓存,延迟执行)
  4. 组合函数 马上计算
  5. 声明式与命令式
  6. reduce

自己实现数组中的map

 Array.prototype.map=function(arr,func){
     var results = [];
     for(var i = 0,len = a.length;i<leni++){
         if(i in a){
             results[i] = f.call(null,a[i],i,a);
         }
         return results;
     }
 }

自己实现数组中的reduce

Array.prototype.reduce = function (a, f, initial) {
  var i = 0,
    len = a.length,
    accumulator;

  //以特定的初始值开始,否则第一个取值自a
  if (arguments.length > 2) {
    accumulator = initial;
  } else {
    //找到数组中第一个已定义的索引
    if ((len = 0)) throw TypeError();
    while (i < len) {
      if (i in a) {
        accumulator = a[i++];
        break;
      } else i++;
    }
    if (i == len) throw TypeError();
  }

  while (i < len) {
    if (i in a) {
      accumulator = f.call(undefined, accumulator, a[i], i, a);
      i++;
    }
    return accumulator;
  }
};