JavaScript的编码原则 | 青训营笔记

54 阅读5分钟

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

如何写好js

想要写好js,首先需要的是学好js,推荐两本技术学习书籍:JavaScript权威指南、JavaScript高级程序设计。 写好js的一些原则:

  1. 各司其职 html、css、js分离编写,分工明确才能思路清晰
  2. 组件封装 对于一些我们经常使用的页面功能,如轮播图、一键返回顶部等,我们可以用js代码封装一个组件,随用随取
  3. 过程抽象 运用函数式编程思想

个人理解:将前端比作一栋房子,html奠定地基与架构,css对房屋进行,js实现房屋内外的一些复杂功能,如开门关门,上锁,灶台,烟囱

举例展示

要求:写一段js代码,控制一个网页让它支持浅色与深色两种浏览模式 解决方案:直接通过原生js,获取控制按钮,根据当前按钮的content或创建一个条件变量,根据条件变量值的改 变操控body对页面浏览模式进行控制 优化方案:放弃使用js控制css样式来实现的方案,通过使用js对body添加与删除类名的方式来实现 深度优化:个人对css和html的理解程度足够强,只通过html+css放方案解决问题

组件封装

组件是指web页面上抽出一个个包含模板(html)、功能(js)、和样式(css)的单元。好的组件具备封装性、正确性、扩展性、复用性、灵活性

举例展示

例子:用原生js写一个电商网站的轮播图 解决方案:从组件的角度出发,在实现一个轮播图的功能前,就要考虑到它所具备的这些特性。首先,在考虑到封装性和复用性的情况下,进行html、css、和js的设计,分别思考每一个部分的特点。

  • html

    • 轮播图是一个典型的列表结构,可以直接使用ul来搭建
  • css

    • 使用css绝对定位将图片重叠在同一个位置
    • 轮播图切换状态的修饰符
    • 轮播图切换动画的过渡
  • js

    • API设计应保证原子操作,职责单一满足灵活性
    • 控制流:使用自定义事件来解耦

最后设计一个轮播图组件的基本方法如下:

  • 结构设计

  • 展现效果

  • 行为设计

    • API(功能)
    • Event(控制流)

优化方案:使用组件时,我们需要将事先设计好的html和css引入,如何将轮播图中的各个控制功能分开使用,做到想用哪个用哪个,这里就需要将控制元素抽取成插件,插件与组件之间通过依赖注入的方式建立联系。 除了了优化方案中所提到的内容外,我们还可以将html模板化,只需要在html中引入一个div即可创建一个轮播图,将html模板化,可以更易于扩展,同时我们可以将一些通用的组件模型抽像出来,以一个单独的插件存在,满足组件的灵活性

总结

组件设计的原则:

  • 封装性
  • 正确性
  • 复用性
  • 扩展性
  • 灵活性

实现组件的步骤:

  • 结构设计
  • 展现设计
  • 行为设计

三次重构:

  • 插件化
  • 模板化
  • 抽象化

一个好的组件是经历多次打磨而成,只要在遵循组件设计的原则上去实现组件,在三次重构中优化组件,最终才能看到令人满意的作品。

过程抽象

用来处理局部控制的一些方法,函数式编程的基础应用? 个人理解:就是,在系统中以最低的损耗实现功能函数的输入与输出,这中间的过程我们称为过程抽象

纯函数与非纯函数

纯函数:在看到函数代码后就知道结构是什么,如(a,b)=>return a+b 非纯函数:无法确定函数输出结构,函数的结构是改变的,如 num=>return num++ 在纯函数中最具代表性的就是高阶函数,高阶函数的特点如下:

  • 以函数作为返回值
  • 以函数作为参数
  • 常用于作为函数装饰器

个人理解:可以将高阶函数当做净水器中的滤芯,水经过过滤器的过滤,返回一个结果,这个时候的结果是固定的,我们都知道是净化过的水,无论之前的水中含有什么,结果都是纯净水

常用高阶函数

  • once

    • 能够让"只执行一次"的需求覆盖不同的事件处理
    • image.png
  • throttle

    • 节流 让函数按照我们在某一段时间内规定的次数执行
function throttle(fn, time = 500){
  let timer;
  return function(...args){
    if(timer == null){
      fn.apply(this,  args);
      timer = setTimeout(() => {
        timer = null;
      }, time)
    }
  }
}
  • Debounce

    • 只有满足条件才会执行否则不会执行的函数
function debounce(fn, dur){
  dur = dur || 100;
  var timer;
  return function(){
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, dur);
  }
}
  • Consumer
  • lterative

命令式与声明式

命令式:就像它的名字一样,所有的结果都需要我们进行一步步的教导一步步命令才能实现
声明式:就像一个机器一样,我们已经设计好了各种功能,在使用时只需要启动即可,不需要一步步的教导和发布命令

总结:

过程抽象听起来很复杂,但理解起来却很容易,设计一个精密的机器解决繁琐的工作这是我的理解,想要在开发中使用需要牢固的js基础。