一起养成写作习惯!这是我参与「掘金日新计划 · 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,真的不太需要记。