这是我参与「第五届青训营 」伴学笔记创作活动的第 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 行,这种函数最好是自己实现
交通灯
版本一
版本一的缺点很明显,有太多层嵌套,无论是可阅读性还是可扩展性都比较差
版本二
版本二是数据抽象的体现,将数据和方法分离
版本三
版本三是过程抽象的体现,将步骤进行拆分,抽象成可复用的函数
版本四
版本四可以看成两种抽象的综合,版本二的函数过于复杂,版本三的函数过多,实际上对于交通灯我们只需要关注它等待和切换状态这两个步骤