你,真的了解你每天写的function吗?纯函数

216 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

一:故事的开始

周五的下午,打工人很讲道理的写了经常写的页面逻辑,看着屏幕中跳跃出的字符组成那熟悉的代码。打工人不禁有点恍惚。脑海里产生了一个打工人自己都害怕的问题:函数,到底是用来干什么的?于是,打工人转过头:辉哥,函数是用来干嘛的?辉哥回过头看傻子似的看着打工人:滚,闲的没事了就多看看vue源码。 emmm,俗话说的好,问题一旦有了,那就只有两个结果,要不打工人解决他,要不打工人被他解决。于是打工人中午罕见的失眠了。接下来的分享是打工人含辛茹苦的学习笔记。

二:概念的清晰

·命令式编程:

·命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。 相当于什么呢?相当于你洗衣服的时候站在洗衣机边:

洗衣机哦,我告诉你哦,你一定要按照我给你准备的步骤来哦
1.放脏衣服
2.放水
3.放洗衣粉
4.摇摆
5.转动甩干

这个时候,思考如何命令的全面无缺,就成为了程序员的全部任务

举个例子吧,找出大于5的数字

const results = [1,2,3,4,5,8,6,];
const newArr=[]
for(let num=0;num<results.length;num++){
    if(results[num]>5){
        newArr.ppush(results[num])
        }
}

·声明式编程: · 声明式编程是以数据结构的形式来表达程序执行的逻辑。它的主要思想是告诉计算机应该做什么,但不指定具体要怎么做。 相当于什么呢?相当于你洗衣服的时候站在洗衣机边:

洗衣机哦,洗衣服哦,环境我给你创建好了
洗衣机:????

这个时候,程序员能省很多力气

SQL 语句就是最明显的一种声明式编程的例子,例如:

SELECT * FROM collection WHERE num > 5

此外,我们前端经常写的HTML CSS都是属于声明式编程。 声明式编程有两个特点:

  • 1-- 不需要创建变量用来存储数据
  • 2-- 它不包含循环控制的代码如 for, while。

·函数式编程:(重点来了) 函数式编程和声明式编程是有所关联的,因为他们思想是一致的:即只关注做什么而不是怎么做。但函数式编程不仅仅局限于声明式编程

更深入一点:函数式编程以另一种方式来思考代码应该如何组织才能**使数据流更加明显**,并能让读者很快理解你的思想

还记得那句话吗?函数是第一公民。就是这么霸道。在函数式编程里,函数始终是排位第一的。

函数的本质是什么呢?

y=2x是我们大家都学习过的,这里引用一句话函数的本质是【映射】。以一个优雅的方式来描述一组值和另一组值的映射关系,即函数的输入值与输出值之间的关联关系。

简单的说就是:要有接收值,要有返回值。在编程中,它或许有许多个输入值,或许没有。它或许有一个输出值( return 值),或许没有。输入值就是函数传的参数,输出值就是return出去的东西。(如果没有 return 值,或者直接使用 return;结束,那么则会隐式地返回 undefined 值。)

function doSome(a){
    if(a>0){
        return a+1
    }else{
        return a
     }
}

以上代码可变形为

function doSome(a){
     var retu;
    if(a>0){
        retu= a+1
    }else{
        retu =a
     }
     return retu;
}

相信以上的代码大家都写过,这里的if else可以有很多,他们确保retu有值。

那么写return和不写return的区别是什么呢?

var y;
function doSome(a){
   y=a+1
}
doSome(2)
y;//3

以上代码可变形为


function doSome(a){
   return a+1
}
var y=doSome(2)
y;//3

区别在哪?第一个y 赋值是一个隐式输出,第二个return 表示一个显式输出。

通常我们都喜欢一个函数有明确的输出,而不是一个函数看了半天都不明白这个函数到底什么作用。 这点不得不提,那就是函数副作用---------无副作用的函数呢,我们称之为纯函数。

纯函数定义:相同的输入永远会得到相同的输出,而且没有任何可观察的

这得再来个例子-我们熟悉 的数组处理方法splice和slice.

//纯函数slice和不纯函数splice
let array=[1 ,3,6,8]
//slice不改原数组,第次输出结果是- -样的,是纯函数
console.log(array.slice(0,3))  //[1,3,6]
console.log(array.slice(0,3))  //[1,3,6]
console.log(array.slice(0,3))  //[1,3,6]

//splice改变了原数组,每次输出结果不-样,不是纯函数
console.log(array.splice(0,3))  //[1,3,6]
console.log(array.splice(0,3))  //[8]
console.log(array.splice(0,3))  //[]

所以通过这例子,大家就知道纯函数与非纯函数的区别了。

高阶函数

定义:一个函数如果可以接受或返回一个甚至多个函数,它被叫做高阶函数。

熟悉的闭包就是高阶函数

function doSome(a){
       return function doooo(b){
           return a+b
        }
}
//给第一个参数
var t10=doSome(10)
var t20=doSome(20)
//给第二个参数

t10(2)//12
t20(2)//22

这种在连续函数调用中指定输入,是函数式编程中非常普遍的形式。

它可分为两类:偏函数应用柯里化,不懂得可以百度下。

写在最后:

1....提倡使用具名函数,不提倡匿名;这样无论是代码可读性,及排查错误。都可以非常好的。

2....但是箭头函数是一位好同志呀。 => 箭头函数令人兴奋的地方在于它几乎完全遵循函数的数学符号,特别是像 Haskell 这样的函数式编程语言。它能简化、优化代码片段中的空间

3....this其实是隐式传入的一个东西。如果我们按照显式的路子走,那么this,真的不太需要记。