Java函数式编程-JS纯函数-JS柯里化

Java函数式编程-JS纯函数-JS柯里化

1、理解JS纯函数

  • (1)若一个函数符合以下条件,那么这个函数被称为纯函数:
    ①此函数在相同的输入值时,需产生相同的输出 ②此函数在执行过程中,不能产生副作用
    (诸如“触发事件”,使输出设备输出,或更改输出值以外物件的内容等)
  • (2)副作用的理解 表示在执行一个函数时,除了返回函数值之外,还对调用函数产生
    了附加的影响,比如修改了全局变量,修改参数或者改变外部的存储。

例如:
①slice:slice截取数组时不会对原数组进行任何操作,而是生成一个新的数组 (slice是纯函数)
②splice:splice截取数组, 会返回一个新的数组, 也会对原数组进行修改(splice不是纯函数)

var names = ["abc", "cba", "nba", "dna"];
// slice函数本身就是一个纯函数
var newNames1 = names.slice(0, 3);
console.log(newNames1); //[ 'abc', 'cba', 'nba' ]
console.log(names); //[ 'abc', 'cba', 'nba', 'dna' ]  
//原数组没有被修改

// splice在执行时, 会修改掉调用的数组对象本身, 
//修改的这个操作就是产生的副作用
// splice不是一个纯函数
var newNames2 = names.splice(2);
console.log(newNames2); //[ 'nba', 'dna' ]
console.log(names); //[ 'abc', 'cba' ] 原数组被修改

2、JS柯里化

  • 柯里化过程:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数,这个过程就称之为柯里化;
//未柯里化代码
function add(x, y, z) {
  return x + y + z;
}

var result = add(10, 20, 30);
console.log(result); //60

//柯里化代码
function sum1(x) {
  return function (y) {
    return function (z) {
      return x + y + z;
    };
  };
}

var result1 = sum1(10)(20)(30);
console.log(result1); //60

// 简化柯里化的代码
var sum2 = (x) => (y) => (z) => {
  return x + y + z;
};

console.log(sum2(10)(20)(30)); //60

var sum3 = (x) => (y) => (z) => x + y + z;
console.log(sum3(10)(20)(30)); //60

3、柯里化作用

  • (1)让函数的职责单一:将每次传入的参数在单一的函数中进行处理,处理完后在下一个函数中再使用处理后的结果
function sum(x) {
  x = x + 2

  return function(y) {
    y = y * 2

    return function(z) {
      z = z * z

      return x + y + z
    }
  }
}

console.log(sum(10)(20)(30))   //952
  • (2)①柯里化的复用
function makeAdder(count) {
  count = count * count

  return function(num) {
    return count + num
  }
}
var adder5 = makeAdder(5);
console.log(adder5(10)); //25+10=35
console.log(adder5(14)); //25+14=39
  • ②打印日志的柯里化
//未使用柯里化
function log(date, type, message) {
  console.log(
    `[${date.getHours()}:${date.getMinutes()}][${type}]: 
    [${message}]`
  );
}

log(new Date(), "DEBUG", "查找到轮播图的bug");  
//[17:11][DEBUG]: [查找到轮播图的bug]
log(new Date(), "DEBUG", "查询菜单的bug");  
//[17:11][DEBUG]: [查询菜单的bug]

// 柯里化的优化
var log = (date) => (type) => (message) => {
  console.log(
    `[${date.getHours()}:${date.getMinutes()}][${type}]: 
    [${message}]`
  );
};

// 如果我现在打印的都是当前时间
var nowLog = log(new Date());
nowLog("DEBUG")("查找到轮播图的bug");
//[17:12][DEBUG]: [查找到轮播图的bug]
nowLog("FETURE")("新增了添加用户的功能");
//[17:12][FETURE]: [新增了添加用户的功能]

// 如果我现在打印的都是当前时间和DEBUG
var nowAndDebugLog = log(new Date())("DEBUG");
nowAndDebugLog("查找到轮播图的bug");  
//[16:36][DEBUG]: [查找到轮播图的bug]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值