为什么我的闭包函数不想在IF语句中重新赋值其父函数变量?

2022-08-16 00:00:00 factory closures javascript

我已经创建了用于描述游戏逻辑的工厂函数。我使用内部函数在游戏中切换玩家。问题是,当我试图从内部函数中重新分配当前球员时,它不起作用。当前的玩家永远不会改变。我想这是关于结束的事情,我并不是真的理解。你能给我解释一下我错过了什么吗?下面是我正在编写的一段代码:

const game = (() => {
    let player1 = "Jim";
    let player2 = "Mary";
    let currentPlayer = player1;

    const switchPlayers = () => { //This closure function is supposed to reassign the value of currentPlayer above. But it does not do it.
        if (currentPlayer === player1) {
            currentPlayer = player2;
        } else {
            currentPlayer = player1;
        }
        return currentPlayer;
    };

    return {currentPlayer, switchPlayers};

})();

game.switchPlayers // works as needed and switches the players every time it is invoked but does not reassign the variable within its parent function;
game.currentPlayer // does not get reassigned, when switchPlayers function is invoked, and returns player1 as was assigned at the start;

解决方案

您的代码返回currentPlayer的值,该值在原始对象的属性更新时不会更新。因此,闭包运行得很好,但事实是您的返回值并没有指向更新后的对象,它只是一个新值,在return语句时将保持不变。

您需要使用如下函数返回值。

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
let game = (() => {
  let player1 = "Jim";
  let player2 = "Mary";
  let currentPlayer = player1;

  const switchPlayers = () => { //This closure function is supposed to reassign the value of currentPlayer above. But it does not do it.
    if (currentPlayer === player1) {
      currentPlayer = player2;
    } else {
      currentPlayer = player1;
    }
    return currentPlayer;
  };
  
  const getCurrentPlayer = () => currentPlayer;

  return {
    currentPlayer,
    switchPlayers,
    getCurrentPlayer
  };

})();

game.switchPlayers();
console.log(game.currentPlayer);
console.log(game.getCurrentPlayer());

或只需在函数的this指针上定义属性currentPlayer,然后将其用作类型(使用new关键字),如下所示。

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
function GameType() {
   let player1 = "Jim";
   let player2 = "Mary";
   this.currentPlayer = player1;

   this.switchPlayers = () => { //This closure function is supposed to reassign the value of currentPlayer above. But it does not do it.
     if (this.currentPlayer === player1) {
       this.currentPlayer = player2;
     } else {
       this.currentPlayer = player1;
     }
     return this.currentPlayer;
   };
 }

let game = new GameType();

console.log(game.currentPlayer);

game.switchPlayers();
console.log(game.currentPlayer);

相关文章