JavaScript编码原则 | 青训营笔记

28 阅读2分钟

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

一.各司其责

让HTML、CSS和JavaScript职能分离

  • HTML/CSS/JS各司其责
  • 应当避免不必要的由JS直接操作样式
  • 可以用clss来表示状态
  • 纯展示类交互寻求零JS方案

在方案优化上,可以考虑各司其责这一概念,尽可能得满足这一个概念,方案后期方案的优化和修改

二.组件封装

好的UI组件具备正确性、扩展性、复用性

组件是指Web页面上抽出来一个个包含模板(HTML)、功能(JS)和样式(CSS)的单元

基本方法:

  • 结构设计

  • 展示效果

  • 行为设计

    • API(功能)
    • Event(控制流) ——> 使用自定义事件来解耦

进一步优化:

重构:插件化

解耦

  • 将控制元素抽取成插件
  • 插件与组件之间通过依赖注入方式建立联系

重构:模块化

解耦

  • 将HTML模块化,更易于扩展

抽象

  • 将组件通用模型抽象出来

总结:

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

  • 实现组件的步骤:结构设计、展示效果、行为设计

  • 三次重构

    插件化

    模块化

    抽象化(组件框架)

组件的封装需要考虑代码的简洁,数据更换后是否还能展示相同的效果

三.过程抽象

应用函数式编程思想

  • 用来处理局部细节控制的一些方法
  • 函数式编程思想的基础应用

高阶函数

Once

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

 function once(fn){
     return function(...args){
         if{fn}{
             const ret = fn.apply(this.args);
             fn = null;
             return ret;
         }
     }
 }

HOF

  • 以函数作为参数
  • 以函数作为返回值
  • 常用于作为函数装饰器
 function HOFO(fn){
     return function(...args){
         return fn.apply(this.args);
     }
 }

常用高阶函数

  • Once
  • Throttle(节流函数)
  • Debounce(防抖函数)
  • Consumer/2
  • Iterative
 function  throttle(fn,time = 500){
     let timer;
     return function(...args){
         if(timer == null){
             fn.apply(this, args);
             timer = setTimeout(() => {
                 timer = null;
             },time)
         }
     }
 }
 function debounce(fn,dur){
     dur = dur || 100;
     var timer;
     return function(){
         clearTimeout(timer);
         timer = setTimeout(() => {
             fn.apply(this,arguments);
         },dur);
     }
 }

高阶函数的使用可以减少维护的成本

总结

JavaScript对组件化优化时可以思考HTML、CSS、JS是否各司其责,可以适当的引用高阶函数的使用,大大提高组件的可维护性和复用性