根据闭包的特性,完成改功能

内容:使用闭包完成如下要求
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/363537621976190.jpg "#left

img

img

参考GPT和自己的思路:以下是实现该功能的代码:

function makeHistory(maxActions) {
  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"。