跟着月影学Javascript|青训营课程笔记

122 阅读5分钟

##这是我参与「 第五届青训营 」伴学笔记创作活动的第 3 天##

一、说在前面

本堂课老师没有介绍JavaScript的基础语法知识,而是从另一个角度去剖析如何去写出优雅的Javascript代码,老师通过举例和一步步优化代码的过程向我们展示原则的一些应用。

二、重要知识点介绍

写好JS的一些原则

1.各司其责:HTML、CSS和JS职能分离,HTML负责内容,CSS负责样式,JS负责行为,代码写在同一个地方不代表违背了这个原则,该原则只是指明了他们都应该负责的范畴。

2.组件封装:好的UI组件应具备正确性、扩展性和复用性。

3.过程抽象:应用函数编程思想。

举例和代码优化

原则一之深夜食堂

效果图:

image.png

image.png

最终的代码版本:深夜食堂(代码来源:十年踪迹) - 码上掘金 (juejin.cn)

主要是满足用户在浏览时的一些需求:切换白天模式和夜间模式,但是夜间模式切换其实是样式,尽量用CSS实现,而不是JS。

总结:

1.HTML/CSS/JS各司其责

2.应当避免不必要的由JS直接操作样式

3.可以用class来表示状态

4.纯展示类交互寻求零JS方案

原则二之轮播图

效果图:

image.png

代码版本之一:轮播图(代码来源:十年踪迹) - 码上掘金 (juejin.cn)

最终代码版本:轮播图final(代码来源:十年踪迹) - 码上掘金 (juejin.cn)

结构:HTML 轮播图是一个典型的列表结构,我们可以使用无序列表ul元素来实现。

表现:CSS 使用CSS绝对定位将图片重叠在同一个位置;轮播图切换的状态使用修饰符(modifier);轮播图的切换动画使用CSS transition。

行为:JS API

image.png

getselecteditem 获取当前的图片元素

getselecteditemindex获取当前的图片元素在列表中的下标

slideto轮播到列表中的某一元素

slidenext轮播下一张图片

slideprevious轮播上一张图片

插件化:

image.png

总结:

1.组件设计的原则:封装性、正确性、扩展性、复用性

2.实现组件的步骤(组件封装的基本方法):结构设计、展现效果、行为设计(API(功能) Event(控制流))

3.三次重构:插件化(例:手气不错)、模板化(重构、解耦)(使易于扩展)、抽象化(组件框架)(将组件的通用模型抽象出来)

原则三

1.用来处理局部细节控制的一些方法

2.函数式编程思想的基础应用

代码1:过程抽象例1(代码来源:十年踪迹) - 码上掘金 (juejin.cn)

常用高阶函数HOF:

image.png

以函数作为参数

以函数作为返回值

常用于作为函数装饰器

1.Once

为了能够让“只执行一次”的需求覆盖不同的事件处理,我们可以将这个需求剥离出来。这个过程我们称为过程抽象

image.png

2.Throttle

代码:code.juejin.cn/pen/7108192…

3.Debounce

代码:code.juejin.cn/pen/7108193…

小鸟:防抖功能,鼠标快速多次移动时,小鸟不跟随

4.Consumer/2

代码1:code.juejin.cn/pen/7108194…

代码2:code.juejin.cn/pen/7108194…

consumer 也可以延时调用(代码2)

5.Iterative

代码:code.juejin.cn/pen/7108194…

纯函数:无副作用,函数可预期的 输入被确定,即输出被确定

系统的非纯函数越多的话,系统的可维护性越差

高阶函数都是纯函数

编程范式:命令式与声明式

image.png

image.png

1.命令式的编程语言(面向对象/面向过程)(强调怎么做)

2.声明式的编程语言(强调做什么)(更加简洁)

3.例子:

Toggle(命令式)代码:code.juejin.cn/pen/7108195…

Toggle(声明式)代码:code.juejin.cn/pen/7108195…

Toggle(三态)代码:code.juejin.cn/pen/7108195…

Javascript同时拥有命令式和声明式的编码方式

总结

1.过程抽象/HOF/函数装饰器

2.命令式/声明式

交通灯的状态切换

版本一:code.juejin.cn/pen/7108196…

效果图:

image.png

版本二(数据抽象):code.juejin.cn/pen/7108196…

image.png

版本三(过程抽象):code.juejin.cn/pen/7108196…

版本四(异步+函数式):code.juejin.cn/pen/7108196…

判断是否是4的幂

code.juejin.cn/pen/7108197…

洗牌

错误写法的代码:code.juejin.cn/pen/7108202…

错误做法:分布不均匀的算法

image.png

正确的代码写法:code.juejin.cn/pen/7108203…

image.png

使用生成器:code.juejin.cn/pen/7108203…

分红包

image.png

切西瓜法:code.juejin.cn/pen/7108203…

抽牌法:code.juejin.cn/pen/7108204…

要考虑钱够不够分!?

切西瓜法:选取比较大的那块继续进行拆分

抽牌法:空间复杂度高

三、课后个人总结

老师通过许许多多的实例充分为我们展示了“各司其责、组件封装、过程抽象”三大原则,主要目的是为了提高我们的代码优化意识,让我们不只是会写代码。而是懂得如何去写好的代码,老师认为写代码最应该关注的是其使用场景,他认为同时不能忽略基础的算法问题,要学好数学,写出优雅的算法。由于之前没有学习JS的基础语法,所以对于老师这堂高阶的课程吸收得有点困难,但是对于老师讲的例子都充满了十分的好奇,相信我会找出充裕的时间去慢慢摸索、学习和掌握!大家一起加油吧!

四、学习资料补充

课件链接:‌⁢跟着月影学 JavaScript(上).pptx - 飞书云文档 (feishu.cn)

如何写好 JS1

code.juejin.cn/pen/7117822…

如何写好 JS2

code.juejin.cn/pen/7119668…

学习 javascript 基础语法

developer.mozilla.org/en-US/docs/…

五、参考引用

【前端专场 学习资料一】第五届字节跳动青训营 - 掘金 (juejin.cn)

六、一点疑问

如何用快捷键取消多行注释/进行多行注释?🐣

(以上代码资料均来源于作者老师“十年踪迹”,特在此声明)若以上内容描述有误,欢迎批评指正,谢谢!