JavaScript纯函数

43 篇文章 4 订阅

1.纯函数概念

函数式编程中有一个概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念。

  • 在react开发中纯函数是被多次提及的;
  • react中组件被要求像是一个春寒苏,redux中有一个reducer的概念,也是要求必须是一个纯函数;
  • 所以掌握纯函数对于理解很多框架的设计是非常有帮助的;

纯函数的维基百科定义:

  • 在程序设计中,若一个函数符合以下条件,那么这个函数被称为纯函数:
  • 此函数在相同的输入值时,产生相同的输出
  • 函数的输出与输入值以外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关;
  • 该函数不能有语义上可观察的函数副作用,诸如“触发事件”,是输出设备输出,或更改输出值以外物件的内容。

总结:

  • 确定的输出,一定会产生确定的输出;
  • 函数在执行过程中,不能产生副作用 

1.2.副作用概念的理解

副作用(side effect)其实本身是医学的一个概念,比如我们经常说吃什么药是为了治病,可能会产生一些副作用;

在计算机科学中,也引用了副作用的概念,表示在执行一个函数时,除了返回函数值之外,还对调用函数产生了附加的影响, 比如修改了全局变量,修改参数或者改变外部的存储; 

纯函数在执行的过程中就是不能产生副作用,副作用往往是产生bug的温床。

2.纯函数的案例

一个对数组操作的两个函数,看一下哪些是纯函数:

  • slice:slice截取数组时不会对原数组进行任何操作,而是生成一个新的数组;
  • splice:splice截取数组,会返回一个新的数组,也会对原数组进行修改;

slice是一个纯函数,不会修改数组本身,而splice函数不是一个纯函数。

var name = ["aaa", "bbb", "ccc"]

var newName = name.slice(0, 2)
console.log(newName)


var newName2 = name.splice(0, 2)
console.log(newName2)
console.log(name)//原数组会被修改
function sum(num1, num2) {
    return num1 + num2
}
//纯函数,有确定的输出值,并且没有外部引用。
let foo = 5

function add(num){
    return foo + num
}

console.log(add(5))

foo = 10

console.log(add(5))

//不是纯函数,引用了外部变量
function printInfo(info) {

    console.log(info.name, info.age)
    info.name = "哈哈哈哈哈哈哈" //修改了对象的值,不是一个纯函数
}

3.纯函数的作用和优势

使用纯函数就可以安心编写和安心使用;

  • 你在写的时候保证了函数的纯度,只是单纯实现自己的业务逻辑即可,不需要关心传入的内容是如何获得的或者依赖其他的 外部变量是否已经发生了修改;
  • 你在用的时候,你确定你的输入内容不会被任意篡改,并且自己确定的输入,一定会有确定的输出;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

至尊绝伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值