函数式编程

函数式编程

纯函数
  • 一个函数只依赖于它的参数,并且在执行过程中没有副作用(定义)
var a=1;
const foo=(b)=>a+b;
foo(2);

此时foo不是一个纯函数,因为它返回的值依赖于它的外部变量a,在不知道a的情况下,我们并不能保证foo(2)返回3

const a = 1
const foo = (x, b) => x + b

此时满足于纯函数第一个条件,只依赖于它的形参

const a = 1
const foo = (obj, b) => {
  obj.x = 2
  return obj.x + b
}
const counter = { x: 1 }
foo(counter, 2) // => 4
counter.x // => 2

foo在执行中对外部的counter产生了影响,因此此时不是纯函数

const foo = (b) => {
  const obj = { x: 1 }
  obj.x = 2
  return obj.x + b
}

此时虽然修改了obj,obj为函数内部对象,但是它对于外部没有产生可观察的外部变化,因此此时它为纯函数

总结

一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数叫做纯函数。

柯里化
  • 定义:是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术
//普通函数
function add(x,y){
 return x+y
}
//柯里化
function addCury(x){
 return function(y){
  return x+y
 }
}
add(1,2) //3
addCury(1)(2) //3
  • 实际上就是把add函数的x,y两个参数变成了先用一个函数接收x然后返回一个函数去处理y参数。

柯里化优势

  • 参数复用
//普通函数
function check(reg,txt){
 return reg.test(txt)
}
check(/\d+/g, 'test')       //false
check(/[a-z]+/g, 'test')    //true
//柯里化
function curCheck(reg){
 return function(txt){
  return reg.test(txt);
 }
}
var hasNumber = curCheck(/\d+/g)
var hasLetter = curCheck(/[a-z]+/g)
hasNumber('test1')      // true
hasNumber('testtest')   // false
hasLetter('21212')      // false
  • 提前确认
  • 延迟执行

面试题

// 实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;
//函数
function add() {
     var _args=Array.prototype.slice.call(arguments);
     var _adder=function () {
      _args.push(...arguments);
      return _adder;
     }
     _adder.toString=function () {
       return _args.reduce(function (a,b) {
         return a+b;
       })
     }
     return _adder;
   }

函数式编程与面向对象编程

  • 函数式编程
const state={
     Animal:0,
     DOG:1,
     speak:['makes a noise','barks']
   }
   const actions={
     of:function (name) {
       return function (speak) {
         speak(name)
       }
     },
     speak:function (kind) {
       return function (name) {
         console.log(name+state.speak[kind])
       }
     }
   }
   let aa=actions.of('Mitzie');
   aa(actions.speak(state.DOG)); //Mitziebarks
  • 面向对象编程
class Animal{
     constructor(name){
       this.name=name;
     }
     speak(){
       console.log(this.name+' make a noise');
     }
   }
   class Dog extends Animal{
     constructor(name,sex){
       super(name);
       this.sex=sex;
     }

     speak(){
       console.log(this.name+' barks');//dog barks
       console.log(this.name+'的性别是:'+this.sex);//dog的性别是:公
     }
     parentSpeak(){
       super.speak();//dog make a noise
     }
   }
   let bb=new Dog('dog','公');
   bb.speak();
   bb.parentSpeak();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值