函数式编程理解

编程思维方式

  • 面向对象编程:对现实世界中的事物进行抽象,通过封装、继承、多态来演示事物之间的联系
  • 面向过程编程(函数式编程):对现实世界中事物的联系进行抽象,对运算过程进行抽象
    • 函数式编程用来描述数据之间的映射
    • x-> f(关系,映射) -> y 即 y=f(x)
    • 相同的输入必然得到相同的输出(纯函数)

函数是一等公民

  • 函数可以赋值给变量
  • 函数可以作为参数
  • 函数可以作为返回值

高阶函数

  • 函数作为参数

    遍历数组,对数组中每一项元素进行fn操作;

    foreach即高阶函数,抽象遍历数组部分的通用逻辑;将操作fn通过参数转入

    function foreach(arr,fn){
      for(let i=0;i<arr.length;i++){
        fn(arr[i]);
      }
    }
    
    let arr = [1,2,3,4,5];
    
    foreach(arr,function(i){
      console.log(i);
    })
    复制代码
  • 函数作为返回值
    once即高阶函数,用于控制只运行一次的逻辑

    function once(fn){
        let done=false;
        return function(){
            if(!done){
                done = true;
                return fn.apply(fn,arguments);
            }
        }
    }
    let pay = once(function(money){
        console.log(`支付了 ${money} RMB`);
    })
    // 只会支付一次
    pay(5);
    pay(5);  
    pay(5);
    复制代码

高阶函数的作用
高阶函数用来抽象函数通用部分,抽象可以帮我们屏蔽细节,是我们只关注于目标

闭包

在另一个作用域中,调用一个函数的内部函数,并通过内部函数访问到其内部变量;

例如:调用函数A返回的函数B,通过函数B访问函数A的局部变量

其实上面的 pay 函数也是一个闭包 ,因为访问了once函数的内部变量done

function A() {
  let s = "closure";
  return function B() {
    console.log(s);
  }
}
let b = A();
b();
复制代码

栈内存中的变量一般会在函数结束运行后进行垃圾回收,而堆内存中的变量则不会。堆内存变量通过判断是否还有其他引用,当所有对它的引用结束,才会被垃圾回收。

因此闭包中的变量不会存放在栈内存,而是存放在堆内存,这也能解释为什么放函数已经关闭,该函数内部的变量却还能被访问。

闭包的作用
延长局部变量的生存时间

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享