【发布时间】:2019-10-22 03:10:09
【问题描述】:
假设我有这样的代码:
function example() {
const obj = {};
for (let i = 0; i < 10; i++) {
for (let j = 0; j< 10; j++) {
if (obj[i] == undefined) {
obj[i] = 0;
}
if (obj[j] == undefined) {
obj[j] = 0;
} else {
obj[i] += i;
obj[j] += j;
}
}
}
}
在这里你可以看到:
if (obj[i] == undefined) {
obj[i] = 0;
}
我检查i 是否不在obj 中我将i 内的obj 分配为0,否则我什么也不做,我用j 做样本。
代码是重复的,我不想重复自己,这是不好的做法,所以我创建另一个函数来申请i和j,如下所示:
function initObjWithValue(obj, keys) {
for (const key of keys) {
if (obj[key] === undefined) {
obj[key] = 0;
}
}
}
这个功能很容易理解吧?它的第一个参数是对象,第二个参数是要检查的键数组。现在我可以像这样重构我的代码:
function example() {
const obj = {};
for (let i = 0; i < 10; i++) {
for (let j = 0; j< 10; j++) {
initObjWithValue(obj, [i, j]);
obj[i] += i;
obj[j] += j;
}
}
}
代码更清晰,但正如您在我的函数initObjWithValue 中看到的那样,它变异了obj,我认为它不好。这是维基页面的引用:
在计算机编程中,纯函数是具有以下属性的函数: 对于相同的参数(本地静态变量、非本地变量、可变引用参数或来自 I/O 设备的输入流没有变化),它的返回值是相同的。
而我就卡在了这一点上,在这种情况下,我怎么能不重复自己,实现纯函数呢?
【问题讨论】:
标签: javascript purely-functional