如何写好JavaScript | 青训营

40 阅读2分钟

写好 JavaScript 的原则

  • 各司其责

HTML / CSS / JavaScript 应该各司其责,避免由 JavaScript 直接操作样式,另外可以使用 class 来表示状态,最后纯粹的展示类交互尽量寻求零 JavaScript 的方案。

  • 组件封装

组件:Web页面上抽出来一个个包含模板(HTML)、功能(JavaScript)和样式(CSS)的单元。好的组件应该具有封装性、正确性、扩展性和复用性。这是组件设计的原则

组件封装的基本方法/步骤是:HTML 进行结构设计,CSS 展现效果,JavaScript 进行行为设计,需分为功能 API 和控制流 Event两个方面。

重构:插件化(将控制因素抽取成插件,插件和组件之间通过依赖注入的方式建立联系)、模板化(将 HTML 模板化,以满足扩展性)、抽象化(将通用的组件模型抽象出来以满足复用性)。

  • 过程抽象

含义:为了能够让“只执行一次”的需求覆盖不同的事件处理,将这个需求剥离出来。这个过程称为过程抽象。用来处理局部细节控制的一些方法;是函数式编程思想的基础应用。

课程例子:为了点击按钮后只调用一次“完成任务”,因为点击多次如果调用多次会出现错误,使用到了 Once 函数,将相关的 JavaScript 过程代码封装起来。Once的原理是对参数进行是否为 null 的判断,不为 null 则调用具体过程代码,否则不执行。

高阶函数

类似 Once 函数的这一类函数称为高阶函数,以函数作为参数,以函数值作为返回值,常用于作为函数装饰器。

function HOF0(fn) {
    return function(...args) {return fn.apply(this, args);}
}

常用的高阶函数(HOF)有 Once、Throttle(节流函数,有鼠标点击、数据自动保存(防抖)等应用)、Debounce、Consumer(同步的事件转为一定时间间隔的异步事件)、Iterative(实现批量操作)等函数。使用高阶函数可以大大减少使用非纯函数的可能性。

编程范式:

  • 命令式:更强调怎么做
  • 声明式:更强调做什么,相比于命令式更简洁

写代码最应关注什么

使用场景

Leftpad事件:

一个名为"left-pad"的小型 npm 模块从 NPM 上被撤销,导致众多的JavaScript项目无法再正常工作。

源代码:

function leftpad(str, len, ch) {
    str = String(str);
    var i = -1;
    if (!ch && ch !== 0) ch = ";
    len = len - str.length;
    while (++i < len) {
        str = ch + str;
    }
    return str;
}
  • NPM 模块粒度
  • 代码风格
  • 代码质量/效率 优化后(代码更简洁,效率提升):
function leftpad(str, len, ch) {
    Str = "" + str;
    const padBen = len - str.length;
    if(padLen <= 0) {
        return str;
    }
    return (""+ch).repeat(padLen)+str;
}