Javascript 笔记(二):闭包(2)与map知识点
需求
要写一个闹钟控件,分为小时和分钟两个部分。两个部分的逻辑是一样的,只有域不同所以为了提高代码利用率,就使用闭包来完成。
问题
function loop_tuple(){
let index = 0
return function(tuple){
index=(index+1)%3
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(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() {
// 创建一个对象,用于保存每个数组的index
const indices = new Map();
return function(tuple) {
// 如果此数组没有对应的index,初始化为0
if (!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=0
return function(){
const value = tuple[index]
index=(index+1)%tuple.length
return 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.length
return tuple[index]
}
如此一写输出值就从第二个元素开始输出了,后面想着调换一下顺序
return function(){
return tuple[index]
index=(index+1)%tuple.length
}
这个错误太低级了
这样导致现return了,后面的部分根部就不会执行。求助gpt才知道只要先声明一个变量value
接受值即可。