Javascript函数式编程之纯函数

一、前言

夏日炎炎,七夕节刚过完,不知道大家有木有吃饱狗粮(当然,有对象的就当我没说啦~),对于我这样的单身狗来说,看着别人成双成对的,心里想着什么时候的七夕节不是我一个人过就好了。但是在Javascript里面,有句话说得好啊,一切皆对象,没对象的可以new一个对象啊,什么,一个对象还满足不了你,好吧,那就new两个对象吧~
好了,接下来我们言归正传吧。貌似有两个月没写博客了,嘿嘿,前段时间在给我的JS打基础,不过现在正在学习Node.JS和炫酷的Canvas了,所以我想把我最近的心得体会纪录下来和大家分享分享,有什么不对的地方也请大家指正!
在JS中有面向过程编程和面向对象(不是七夕节的“对象”)编程,那不知你是否看见过函数式编程,如果没有,哈哈,那太棒了,你可以继续往下看了(继续听我扯淡)。

二、什么是纯函数?

  • 所谓纯函数,就是指这样一个函数,对于相同的输入,永远得到相同的输出,它不依赖外部环境,也不会改变外部环境。如果不满足以上几个条件那就是非纯函数。

首先我们来看几个纯函数的例子:

function fn(a,b,c){
    return a + b + c; 
}
console.log(fn(1,2,3));//控制台输出6
console.log(fn(1,2,3));//控制台输出6
console.log(fn(1,2,3));//控制台输出6
console.log(fn(1,2,3));//控制台输出6

对于函数fn来说,传入相同的实参1,2,3,得到了相同的结果,即在控制台输出了4次6,所以fn是纯函数。

var arr = [1,2,3,4,5,6];
var arr2 = arr.filter(function(item,index,self){
    return item > 3;
});
console.log(arr2);//控制台输出[4,5,6]
console.log(arr);//控制台输出[1,2,3,4,5,6]

数组的filter方法不会改变原数组,他会返回一个新的数组,所以他也满足纯函数的条件。
再看看非纯函数:

function getDate(){
    console.log(new Date());
}
setInterval(getDate,1000);

每隔一秒得到不同的时间,所以它是非纯函数。

function fn(a){
    return a + Math.random();
}
console.log(fn(1));//在控制台输出1.4536954151609074
console.log(fn(1));//在控制台输出1.7727658928230619
console.log(fn(1));//在控制台输出1.5366908662608652

函数fn分别得到不同的结果,所以也是个非纯函数。

  • 纯函数的优点

Ⅰ、不会改变外部环境的变量,就像上面所说的一样,非纯函数会改变外部环境的变量,多次调用得到不同的结果,大家可以尝试下面的代码:

var arr = [1,2,3,4,5,6,7,8,9];
arr.splice(2,3);
console.log(arr);//控制台输出[1,2,6,7,8,9],数组arr改变
arr.splice(2,3);
console.log(arr);//控制台输出[1,2,9],数组arr改变
arr.splice(2,3);
console.log(arr);//控制台输出[1,2],数组arr改变

Ⅱ、相同的输入永远对应相同的输出

三、结语

以上就是我对纯函数的理解啦,对于不足和错误的地方也请大家多多指正,最后,再次感谢大家阅读!

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页