函数式编程与闭包,大厂Offer拿到手软啊

  • 函数式编程可以抛弃this。

很多同学在学习js前都接触过面向对象的语言,比如:java、c#、c++等等,所以在学习js时我们大都是从面向对象开始学习的,我们会学习原型原型链模拟继承来实现面向对象的一些特性,当然我们在学习中也会遇到烦人的this,在使用的过程中我们肯定也遇到过很多各种各样的问题,我们在使用js模拟面向对象是也非常的痛苦,那之后我们可以使用函数式编程,使用它我们甚至可以抛弃烦人的this

  • 打包过程中可以更好的利用tree shaking过滤无用代码

  • 方便测试,方便并行处理

  • 有很多库可以帮助我们进行函数式开发:lodash、underscore、ramda

什么是函数式编程

==================================================================

函数式编程(Functional Programming,FP) FP是编程范式之一,他和面向对象编程是并列的关系,函数式编程我们可以认为是一种思维的方法,加上他的实现方法,我们常听说的编程范式还有面向过程编程、面向对象编程。

面向过程其实就是现实世界的处理方式,一步一步的按照步骤来实现

  • 面向对象编程的思维方式:把现实世界中的事物抽象成程序世界中的类和对象,通过封装、继承和多态来演示事物事件的联系

  • 函数式编程的思维方式:把现实世界的事物和事物之间的联系抽象到程序世界(对运算过程进行抽象)

  • 程序的本质:根据输入通过某种运算获得相应的输出,程序开发过程中会涉及很多有输入和输出的函数

  • x --> f(联系、映射) -> y; y = f(x)

  • 函数式编程中的函数指的不是程序中的函数(方法),而是数学中的函数即映射关系,例如:y = sin(x),x和y的关系

  • 相同的输入始终要得到相同的输出(纯函数)

  • 函数式编程用来描述数据(函数)之间的映射

// 非函数式 — 面向过程编程方式

let num1 = 2

let num2 = 3

let sum = num1 + num2

console.log(sum)

// 函数式

function add (n1, n2) {

return n1 + n2

}

let sum = add(2,3)

console.log(sum)

  • 从代码我们可以看出函数式编程提高了我们的代码重用性,而且在我们的编程中,将多个函数组合在一块可以组合出一个功能更强大的函数,这是非函数式编程所欠缺的

前置知识

==============================================================

  • 函数是一等公民

  • 高阶函数

  • 闭包

函数是一等公民


MDN First-class Function (在以下三点解释)

* 函数可以存储在变量中

* 函数作为参数

* 函数作为返回值

在js中函数就是一个普通的对象(可以通过new Function()),我们可以把函数存储到变量/数组中,它还可以作为另一个函数的参数和返回值,甚至我们可以在程序运行的时候通过new Function(‘alert(1)’)来构造一个新的函数。

  • 把函数赋值给变量

// 把函数赋值给变量

let fn = function(){

console.log(‘hello world’)

};

fn();

// 一个示例

const BlogController = {

index (posts) { return Views.index(posts) },

show (post) { return Views.show(post) },

create (attrs) { return Db.create(attrs) },

update (post, attrs) { return Db.update(post, attrs) },

destroy (post) { return Db.destroy(post) },

}

// 如果我们将来遇到一个函数包裹一个函数,而且它的形式也相同时,我们可以认为,这是两个一样的函数,那我们就可以把这段代码进行一点精简,我们可以看到index和其内部的Views.index是一样的,所以我们可以把Views.index赋值给index,注意,我们是将一个方法或者函数赋值给另一个方法,不是把函数的调用赋值给另一个方法

// 当我们改造完成后,代码量将减少很多,功能也完全一样,这里我们就用到了将一个函数或者方法赋值给另一个函数或者方法

// 优化

const BlogController = {

index: Views.index,

show: Views.show,

create: Db.create,

update: Db.update,

destroy: Db.destroy

}

  • 函数式一等公民是我们后面要学习的高阶函数、柯里化的基础

高阶函数


什么是高阶函数

  • 高阶函数(Higher-order function) — 学过react的话会觉得名字和其中的高阶组件一样,其实react的高阶组件本质上就是高阶函数

  • 可以把函数作为参数传递给另一个函数

  • 可以把函数作为另一个函数的返回结果

  • 函数作为参数

// 高阶函数—函数作为参数

// forEach

function forEach (array,fn){

for(let i = 0; i < array.length; i++){

fn(array[i])

}

};

// filter

function filter (array,fn){

let results = [];

for(let i = 0; i < array.length; i++){

if(fn(array[i])){

results.push(array[i])

}

}

return results;

};

  • 函数作为参数的好处

  • 可以使我们的函数更灵活,调用forEach不需要考虑函数内部是如何实现的,该函数把内部实现的细节帮我们屏蔽了,而且名字都是符合见名知意的,比如forEach一看就是遍历的,filter一看就是过滤的

  • 函数作为返回值

// 高阶函数—函数作为返回值

function fn(){

let msg = ‘hello world’;

return function (){

console.log(msg);

};

};

// 调用方式一

let func = fn();

func();

// 调用方式二

fn()();

// 实际案例:只执行一次的函数

function once(fn){

let done = true;

return function(){

if(done){

done = false;

return fn.apply(this,arguments);

// this — 将自身this传递过去 — 不写就是undefind

// arguments — 将接受的参数传递过去 — 不写就是undefind

};

};

};

let on = once(function(x){

console.log(执行了${x}次);

});

使用高阶函数的意义

===================================================================

对运算过程进行抽象,也就是把运算过程抽象成函数,然后在任何地方都可以去重用这些函数

  • 抽象可以帮我们屏蔽细节,只需要关注我们的目标

  • 高阶函数是用来抽象通用的问题

  • 示例

//遍历一个数组

//面相过程的方式

let array = [1,2,3,4]

for(let i = 0; i < array.lenth; i++){

console.log(array[i])

}

//高阶函数

let array = [1,2,3,4]

forEach(array, item=>{

console.log(item)

})

let r = filter(array,item => {

return item % 2 === 0

})

  • 意义

  • 可以使函数更加灵活

  • 抽象可以帮助我们屏蔽细节

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

最后

中年危机是真实存在的,即便有技术傍身,还是难免对自己的生存能力产生质疑和焦虑,这些年职业发展,一直在寻求消除焦虑的依靠。

  • 技术要深入到什么程度?

  • 做久了技术总要转型管理?

  • 我能做什么,我想做什么?

  • 一技之长,就是深耕你的专业技能,你的专业技术。(重点)

  • 独立做事,当你的一技之长达到一定深度的时候,需要开始思考如何独立做事。(创业)

  • 拥有事业,选择一份使命,带领团队实现它。(创业)

一技之长分五个层次

  • 栈内技术 - 是指你的前端专业领域技术

  • 栈外技术 - 是指栈内技术的上下游,领域外的相关专业知识

  • 工程经验 - 是建设专业技术体系的“解决方案”

  • 带人做事 - 是对团队协作能力的要求

  • 业界发声 - 工作经验总结对外分享,与他人交流

永远不要放弃一技之长,它值得你长期信仰持有

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue 等等。


,当你的一技之长达到一定深度的时候,需要开始思考如何独立做事。(创业)

  • 拥有事业,选择一份使命,带领团队实现它。(创业)

一技之长分五个层次

  • 栈内技术 - 是指你的前端专业领域技术

  • 栈外技术 - 是指栈内技术的上下游,领域外的相关专业知识

  • 工程经验 - 是建设专业技术体系的“解决方案”

  • 带人做事 - 是对团队协作能力的要求

  • 业界发声 - 工作经验总结对外分享,与他人交流

永远不要放弃一技之长,它值得你长期信仰持有

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue 等等。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值