内容:使用闭包完成如下要求
 {
const actions = [];
let index = -1;
return function(action) {
if (action === "undo") {
if (index >= 0) {
const lastAction = actions[index];
index--;
return `${lastAction} undone`;
} else {
return "nothing to do";
}
} else {
if (actions.length >= maxActions) {
actions.shift();
}
actions.push(action);
index = actions.length - 1;
return `${action} done`;
}
};
}
首先,我们定义一个 makeHistory 函数,该函数返回一个闭包函数。闭包函数内部维护了一个数组 actions,记录所有执行过的操作,以及一个变量 index,表示当前可以执行的操作的索引。
在闭包函数内部,我们首先判断传入的操作是否为 "undo"。如果是 "undo",则需要检查是否还有操作可以撤销。如果 index 大于等于 0,则说明还有可以撤销的操作,将最近的一个操作取出来,index 减 1,然后返回撤销的信息。否则,说明没有可以撤销的操作了,直接返回提示信息。
如果传入的操作不是 "undo",则需要将该操作加入到 actions 数组中。如果 actions 数组长度已经达到了 maxActions,则需要将最早的一个操作从数组中删除,保证数组长度不会超过 maxActions。然后将当前操作添加到数组中,更新 index 的值,最后返回操作完成的信息。
使用示例:
// 示例1
const myActions = makeHistory(2);
console.log(myActions("jump")); // 'jump done'
console.log(myActions("undo")); // 'jump undone'
console.log(myActions("walk")); // 'walk done'
console.log(myActions("code")); // 'code done'
console.log(myActions("pose")); // 'pose done'
console.log(myActions("undo")); // 'pose undone'
console.log(myActions("undo")); // 'code undone'
console.log(myActions("undo")); // 'nothing to do'
// 示例2
const myActions = makeHistory(1);
console.log(myActions("jump")); // 'jump done'
console.log(myActions("undo")); // 'jump undone'
console.log(myActions("undo")); // 'nothing to do'
该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据题目描述,要实现一个函数 makeHistory,该函数接受一个整数参数n,返回一个函数,这个函数用于记录最近的n个操作,并支持回退操作(undo)。
以下是一种实现方式:
function makeHistory(n) {
let actions = []; // 用于记录最近的n个操作的数组
let idx = 0; // 记录当前的索引位置
return function(action) {
// 如果当前索引小于最大索引,说明还可以继续添加操作
if (idx < n) {
actions[idx] = action;
idx++;
return action + ' done';
} else {
// 如果当前索引等于最大索引,说明已经存满n个操作,需要删除最早的一个操作
let earliest = actions.shift();
actions.push(action);
return earliest + ' undone\n' + action + ' done';
}
};
}
该函数返回一个函数,这个函数用于记录最近的n个操作,并支持回退操作(undo)。例如,如果我们调用makeHistory(2),就会返回一个函数,这个函数最多记录最近的2个操作。我们可以用这个函数来记录我们的操作,并进行撤销操作。
下面是示例的解释和输出:
const myActions = makeHistory(2); // 创建一个最多记录2个操作的函数
console.log(myActions("jump")); // 记录操作
console.log(myActions("undo")); // 回退操作
console.log(myActions("undo")); // 再次回退操作
// 输出:'jump done', 'jump undone', 'nothing to do'
console.log(myActions("walk")); // 记录操作
console.log(myActions("code")); // 记录操作
console.log(myActions("pose")); // 记录操作
console.log(myActions("undo")); // 回退操作
console.log(myActions("undo")); // 回退操作
console.log(myActions("undo")); // 回退操作
// 输出:'walk done', 'code done', 'pose done', 'pose undone', 'code undone', 'nothing to do'
在第一个示例中,我们先记录了一个操作"jump",然后进行了一次回退操作,此时回退了刚才的操作,所以输出为"jump undone"。再进行一次回退操作,此时已经没有可以回退的操作了,所以输出为"nothing to do"。
在第二个示例中,我们记录了四个操作,分别是"walk"、"code"、"pose"和三次回退操作。由于函数最多记录2个操作,所以当记录第三个操作时,需要删除最早的一个操作"walk"。当进行三次回退操作时,由于只记录了最近的2个操作,所以无法回退到更早的操作,此时输出为"nothing to do"。