Skip to content

函数式编程笔记

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;
    }
}