这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
重点内容
- 组件封装
- 改进空间
- 解耦
- 模块化
- 抽象
- 改进空间
- 过程抽象
- 例子
- 什么是过程抽象
- 高阶函数
- 纯函数
- 编程范式
- 代码优化
- 优化方向
- 例子
- Leftpad npm模块优化
- 交通灯状态切换
- 判断是否是4的幂
- 红包算法
详细知识点介绍
组件封装
改进空间
解耦
控制点和组件是绑定在一起的,不够灵活,不利于修改。重构组件以插件化,将控制元素抽取成插件,插件与组件之间通过依赖注入的方式建立联系。
改进后,构造函数在很大程度上得到简化, 增加/减少功能只需要靠增减插件即可完成
模板化
将组件和插件都模板化(依赖render生成)
js里的img会被render传入html(取li) 插件先render进行渲染,使用img生成插件对应的模板,然后调用action完成插件的初始化
抽象
抽象为通用组件,形成框架。并不改变HTML,CSS,JS各司其职的原则,写在一个文件里并不代表被JS所取代。
Component负责注册插件和渲染;SliderPlugin继承Component,完成渲染和初始化;使用slider的时候需要传入id,并且给slider一个名字。
支持定义组件,添加若干个插件,每个组件都有控制插件。
Component实现了框架的功能。
过程抽象
过程抽象是用来处理局部细节控制的方法,是函数式编程思想的基础应用。但只有纯函数有无副作用的输出。
例子-设置button按钮但只执行一次
const list = document.querySelector('ul');
const buttons = list.querySelectorAll('button');
buttons.forEach((button) => {
button.addEventListener('click', (evt) => {
const target = evt.target;
target.parentNode.className = 'completed';
setTimeout(() => {
list.removeChild(target.parentNode);
}, 2000);
});
});
该代码执行后会报错,解决方案:
- click事件后增加{once:true}
- 或 将evt过程封装为once的过程抽象高阶函数
使用过程抽象高阶函数,外部会形成闭包
什么是过程抽象
让同一个需求覆盖不同的事件处理,将这个需求剥离出来的过程叫做过程抽象
常见的高阶函数:
- Once(限制只使用一次)
- Throttle 节流
- Debounce 防抖
- Consumer
- Iterative(可迭代的方法)
- Array.prototype.filter()等函数,接收函数为参数
纯函数
一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数叫做纯函数。 ——JavaScript----什么是纯函数
编程范式
- 命令式(怎么做):面向过程、面向对象
- 声明式(做什么):逻辑式、函数式子
JS可以兼具命令式和声明式的函数特点,其中声明式的代码会更加简洁。
代码优化
优化方向:
- 风格
- 效率
- 约定
- 使用场景(通用性、资源消耗、性能、系统)
- 设计
例子
Leftpad npm模块优化
考虑通用性,快速幂算法优化、底层字符串拼接算法优化
交通灯状态切换
异步函数、函数式
判断是否是4的幂
二进制转字符串、正则判断
红包算法
切西瓜(红包平均)、抽牌法(胜在随机,但性能差)