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

94 阅读2分钟

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

纯函数与非纯函数

纯函数

当给定相同的输入时,函数总是返回相同的输出

  • 可预测的

  • 没有副作用的

    int sum(int a, int b){ return a + b; }

非纯函数

当给定相同的输出时,函数返回的输出是不确定的、随机的

int sum(int a, int b){
    reutrn a + b + std::rand();
}
  • 不可预测的
  • 有副作用的

JavaScript 中的非纯函数

  • console.log,因为 console.log 是外部 API,并非 JavaScript 方法
  • DOM 操作,当多个脚本同时操作 DOM,会造成结果上的不确定
  • 外部依赖,如全局变量、随机数等
  • 所有异步函数

leftpad 事件

原版

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;}

优化版

function leftpad(str, len, ch) {  str = "" + str;  const padLen = len - str.length;  if (padLen <= 0) {    return str;  }  return ("" + ch).repeat(padLen) + str;}

leftpad 是作用是左侧补齐,第一个参数:原始字符串,第二个参数:字符串的长度,第三个是补充的字符串,原版的时间复杂的为 n,优化版的时间复杂的为 logn,因为 repeat 采用了快速幂。不过无论是原版还是油画版本,都不超过 10 行,这种函数最好是自己实现

交通灯

版本一

版本一的缺点很明显,有太多层嵌套,无论是可阅读性还是可扩展性都比较差

code.juejin.cn/pen/7108196…

版本二

版本二是数据抽象的体现,将数据和方法分离

code.juejin.cn/pen/7108196…

版本三

版本三是过程抽象的体现,将步骤进行拆分,抽象成可复用的函数

code.juejin.cn/pen/7108196…

版本四

版本四可以看成两种抽象的综合,版本二的函数过于复杂,版本三的函数过多,实际上对于交通灯我们只需要关注它等待和切换状态这两个步骤

code.juejin.cn/pen/7108196…