需求
要写一个闹钟控件,分为小时和分钟两个部分。两个部分的逻辑是一样的,只有域不同所以为了提高代码利用率,就使用闭包来完成。
问题
function loop_tuple(){let index = 0return function(tuple){index=(index+1)%3return tuple[index]}
}
const a =[4,5,6]
const b = [7,8,9]
const Loop_tuple = loop_tuple()console.log(Loop_tuple(a))//4
console.log(Loop_tuple(a))//5
console.log(Loop_tuple(b))//9
console.log(Loop_tuple(b))//7
console.log(Loop_tuple(a))//5
bug是传入a和b的时候,两者是共用index,而不是两者分别有一个index。
解决方法
方法一:利用字典map
该方法是问了gpt得出来的,同时也是学习一下map的用法。
1️⃣map知识点
map
是一个字典,其key
和value
是比较自由的.set(key,value)
:设置键值对.get(key)
:获取键对应的值.has(key)
:检查是否含有键.delete(key)
:删除键.clear()
:清空字典.size
:返回字典的大小
2️⃣代码
function loop_tuple() {// 创建一个对象,用于保存每个数组的indexconst indices = new Map();return function(tuple) {// 如果此数组没有对应的index,初始化为0if (!indices.has(tuple)) {indices.set(tuple, 0);}// 获取此数组的index并更新let index = indices.get(tuple);indices.set(tuple, (index + 1) % tuple.length);return tuple[index];}
}const a = [4, 5, 6];
const b = [7, 8, 9];
const Loop_tuple = loop_tuple();console.log(Loop_tuple(a)); // 4
console.log(Loop_tuple(a)); // 5
console.log(Loop_tuple(a)); // 6
console.log(Loop_tuple(a)); // 4
console.log(Loop_tuple(b)); // 7
console.log(Loop_tuple(a)); // 5
该方法就是建立一个字典,字典的键就是两个数组,然后每当函数传入不同的数组的是,就从字典里取出对应数组的index
即可。
方法二:函数工厂
1️⃣思路来源
如我在内部函数里传参就会导致两个函数共用外部函数里面的变量,所以我直接在外部函数传参。
2️⃣代码
function loop_tuple(tuple){let index=0return function(){const value = tuple[index]index=(index+1)%tuple.lengthreturn value}
}
const a =[4,5,6]
const b = [7,8,9]
const Loop_tuple_a = loop_tuple(a)
const Loop_tuple_b = loop_tuple(b)
console.log(Loop_tuple_a())
console.log(Loop_tuple_b())
console.log(Loop_tuple_a())
3️⃣错误记录
此处自己还糊涂了,也记录一下
return function(){index=(index+1)%tuple.lengthreturn tuple[index]}
如此一写输出值就从第二个元素开始输出了,后面想着调换一下顺序
return function(){return tuple[index]index=(index+1)%tuple.length}
这个错误太低级了
这样导致现return了,后面的部分根部就不会执行。求助gpt才知道只要先声明一个变量value
接受值即可。