为什么我的闭包函数不想在 if 语句中重新分配其父函数变量?

2024-02-29

我创建了这个工厂函数,用于描述游戏逻辑。我使用内部函数来切换游戏中的玩家。问题是,当我尝试从内部函数中重新分配当前玩家时,它不起作用。当前的玩家永远不会改变。我想这是关于封闭的一些事情,我并没有真正理解。你能向我解释一下我缺少什么吗?这是我正在处理的代码片段:

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;

It does重新分配变量。

问题是您返回的对象具有以下属性值的副本这些变量的引用,而不是对变量的引用。

So let currentPlayer被改变了但是game.currentPlayer仍然包含原始值的副本。

摆脱变量,只修改对象属性。

const game = (function() {
  const player1 = "Jim";
  const player2 = "Mary";
  let o = {
    currentPlayer: player1
  };

  const switchPlayers = () => {
    if (o.currentPlayer === player1) {
      o.currentPlayer = player2;
    } else {
      o.currentPlayer = player1;
    }
    return o.currentPlayer;
  };

  o.switchPlayers = switchPlayers;
  return o;
})();

console.log(game.currentPlayer);
console.log(game.currentPlayer);
console.log(game.switchPlayers());
console.log(game.currentPlayer);
console.log(game.currentPlayer);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的闭包函数不想在 if 语句中重新分配其父函数变量? 的相关文章

  • 我可以补间 D3 弧的结束角度,但不能补间起始角度。我究竟做错了什么?

    我只是在玩这个演示并自己重新创建它 http bl ocks org mbostock 5100636 http bl ocks org mbostock 5100636 我可以定义一个新的 endAngle 并且它会很好地制作动画 但现在
  • 根据纬度和经度识别哪个是多边形

    我有一张使用 leaflet js 绘制的地图 如果我给出经度和纬度值作为输入 我可以识别多边形吗 我可以获得一个客户端脚本吗 得到答复如下 这是基于 多边形中的点算法 function getPoint float x 89 824218
  • 使用 jQuery/JavaScript 提醒特殊字符

    如何在 Javascript jQuery 警报中显示带有特殊字符 例如 的字符串 例如 我想显示一个消息框 价格为 10 欧元 但是当我使用下面的代码时 alert The Price is euro 10 消息框中显示的输出是 The
  • 声明指令 templateUrl 相对于 root

    我目前正在声明相对于当前窗口位置的 templateUrl cvApp directive personalDetails function return restrict A templateUrl Scripts app templat
  • 在react中读取excel文件

    我正在尝试读取 excel 文件并使用 XLSX 将其转换为 JSON 格式 但无法做到这一点 当文件位于本地计算机上时 任何人都可以建议转换方法吗 通过输入选择您本地机器的 Excel 表 在那之后 您的 Excel 数据将显示为 JSO
  • 同步迭代 javascript 对象

    我有一个像这样的对象 let myObject db1 db1 file1Id db1 file2Id db 1file3Id db2 db2 file1Id db2 file2Id 我遍历这个对象并在每次迭代中 我连接到数据库 检索文件
  • 如何全局公开 es6 模块

    我需要编写一个可在全局窗口上使用的模块 我使用 es6 创建模块 我定义的每个类都有它自己的文件 我正在使用 webpack 来 babelify 并捆绑这些类 我的模块的入口点也是包含要公开的全局的文件 我尝试了各种方法来实现这一点 包括
  • Fabric JS html 5 图像弯曲选项

    我想用html5工具制作图像曲线 我使用 Fabric js 作为 html5 画布工具 请指导我如何在杯子 玻璃 圆柱形或圆形产品等图像上制作弯曲图像 参考号图片如下 http vsdemo cwwws com Images Produc
  • 找出右键单击的 DOM 元素

    我使用以下代码片段来构建自定义上下文菜单
  • jQuery 函数在不应该运行的时候运行

    我有一个函数 仅当宽度小于特定值时才需要运行 我已经这样做了if window width lt n 但当宽度大于 n 时 该函数也会运行 The if if window width lt n 由于背景颜色发生变化 浅灰色 1000px
  • 打字稿地图迭代失败

    我正在使用下面的函数来比较两个地图 有趣的是 for 循环内的代码永远不会被执行 所以 console log key val 代码永远不会被执行 当然 我确保我正在比较的映射不为空并且大小相同 以强制执行 for 循环内的代码 我犯了一个
  • 如何在 Angular 4 材料的 Stepper 中提交表单

    如何在角材料的步进器中提交表单数据 我正在遵循角材料的示例https material angular io components stepper examples https material angular io components
  • 如何让 ckeditor 停止删除空 div

    stackoverflow 上也有类似的问题 但这些问题的答案对我不起作用 所以请不要将其标记为重复 在我的 cms 中 我希望人们能够添加 SPA 单页应用程序 内容页面 此类应用程序通常只有一个具有某些属性的 div 并且使用 java
  • PapaParse 与 Angular JS

    喜欢 PapaParse 漂亮的 CSV 解析器和解解析器 任何人都可以帮助我将其与 Angular JS 结合起来吗 我喜欢让 PapaParse 以 Angular 方式工作 正在尝试解决方案 实际上我没有做任何花哨的事情来加载它 只需
  • IE8 中 JavaScript 日期未定义/NaN

    我用它来测试日期输入是否距今天的日期少于 7 天 它适用于除 IE9 之外的所有浏览器 var today new Date
  • CSS/Javascript 将单词与特定字符对齐

    我如何使用 CSS Javascript 将 html 中的单词与该单词中的任意字符对齐 更改对齐字符的样式 例如使其粗体 以与其他字符形成对比 如本例中所示 对齐和粗体 k e t 和 f stack overflow stack ove
  • Javascript `new` 运算符和原型

    假设我们创建一个名为 Shape 的函数 并在其原型上添加属性 name 和方法 toString var Shape function Shape prototype name Shape Shape prototype toString
  • Javascript,检测触摸设备

    我正在使用此函数来检测设备是否是触摸设备 function is touch device return ontouchstart in window onmsgesturechange in window 从这里得到这个功能 使用 Jav
  • 如何使用ajax从服务器接收返回的数据?

    基本上我有一个带有用户名文本框和提交按钮的表单 现在我想要的是 当用户在文本框中输入文本时 它应该获取文本框值并将用户名发送到服务器 以便服务器可以检查该用户名是否被任何其他用户占用 我可以将文本值发送到服务器 但我不知道如何接收回一些数据
  • 如何从 Backbone 集合中提取多个属性?

    我试图从 Backbone 集合中提取多个属性 但它返回undefined 收藏 id 1 name raju age 23 sex male hobbies id 2 name ramesh age 43 sex male hobbies

随机推荐

  • jQuery 的 ajax 成功函数的额外参数

    我正在使用以下代码获取 XML 文件 function getMaps toLoad loadMaps length for var i 0 i lt loadMaps length i ajax type GET url loadMaps
  • 为什么“findById()”在同一实体上调用 getOne() 后返回代理?

    在我的网络应用程序中 在服务布局中 我使用 餐厅 实体的代理 餐厅 字段中的 FetchType Lazy User user userRepository get userId Getting proxy here not restaur
  • 如何在 docker 容器中对 elasticsearch.yml 进行简单编辑?

    我在用docker compose as in https github com davidefiocco dockerized elasticsearch indexer blob master docker compose yml ht
  • 为什么 html5 postMessage 对我不起作用?

    我使用几行 javascript 来创建一个 iframe 元素 然后我想向它发送一条消息 如下所示 function loadiframe callback var body document getElementsByTagName b
  • 如何修改和使用R包的函数?

    我的问题是关于如何在 R 中调整 控制树状图中的比例 使用 portfolio 库 https stackoverflow com questions 7561423 how do you adjust control the scale
  • 溢出:滚动;在 中

    为什么 CSS 属性overflow scroll 不工作于 td while overflow hidden 效果很好 table border 1 style width 100px tr td style width 50px 100
  • CF9 中的 QueryNew() 数据类型

    我接管了运行 CF9 0 1 的生产服务器上的系统 但在开发人员版本中找不到该系统的副本 因此我正在运行 CF10 我正在将数据从数据库导出到 Excel 由于数据来自多个数据源 因此需要手动将结果输入到查询中 然后用于输出到 Excel
  • 如何比较/匹配两个不相同的声音片段

    我需要每 5 秒采集一次短声音样本 然后将其上传到我们的云服务器 然后 我需要找到一种方法来比较 检查该样本是否是完整长音频文件的一部分 样本将通过手机麦克风录制 因此它们确实不准确 我知道这个主题可能会变得非常技术性和复杂 但我确信一定有
  • Firestore 写入限制错误代码

    Firestore 目前处于测试阶段 并且有每秒写入次数限制 写入 Firestore 数据库时是否可以检查特定的 Firestore 写入错误代码 我的用例是我需要具有查询可能性的高吞吐量 通过检查写入错误代码 我可以稍后重试写入 根据官
  • 用于具有多种类型的嵌套对象的 RedisTemplate 哈希值序列化器

    我正在尝试使用 Redis 为我的实体存储一些缓存数据 其中包含不同类型的字段 例如 public class Job private String id private Date createTime Long private Strin
  • 使用 SDWebimage 通过 url 一张一张下载图像

    我需要从以下位置下载图像Array网址一一显示并一次显示全部 前任 我有 10 个 URL 的数组 我只需要一张一张地下载图像 并一次显示 我在用SDWebImage用于下载图像 请帮我 Thanks 你可以尝试这样的事情 void dow
  • 如何更新学说中的字段以将其设置为空

    我想将原则中的一个字段设置为 null 这是句子 em this gt getDoctrine gt getManager qb em gt createQueryBuilder query qb gt update Model Examp
  • 最小化 Three.js 抽奖次数

    我正在为我的项目测试 Three js 的使用 http agentscript org http agentscript org 并且第一个测试似乎很慢 https asx vqnhxlahpe now sh test html Thre
  • 通过 3 个下拉过滤器过滤客户记录的更好或优化方法

    我有一个页面名称为 客户列表 aspx我在上面显示客户列表 这也是我的表和类文件 public partial class Customer public int CustomerID get set public string FullN
  • Erlang 中的大型可变字节数组

    当我在 Erlang 中编写一个简单的 Minecraft 服务器应用程序时 我现在关心的问题是如何有效地存储和修改块数据 对于那些不了解 Minecraft 内部结构的人 我需要在内存中存储大量高达 32kB 大小的二进制文件 100 1
  • 将一个数据库复制到另一个数据库

    如何从一个数据库复制到另一个数据库 数据库名称visco 我想将所有表从 visco 数据库复制到新数据库名称 neptune 我创建了一个没有任何表的数据库 然后我尝试从database1 bak 文件恢复数据库 然后它显示错误为 You
  • 针对活动目录中的用户进行身份验证?

    我确实有一个 Web 应用程序 其中有一个登录页面 如何针对 Active Directory 用户进行身份验证 截至目前 我能够从活动目录中获取一些属性 这表明我能够使用 LDAP 字符串与 AD 进行通信 我知道不可能从 AD 中提取密
  • 如何传递上下文?

    我想将主要活动的上下文传递给另一个类以创建 Toast 我的主要活动调用一个将删除文件的类 如果文件不存在 删除文件的类将调用 toast 这是我的代码 public class MyActivity extends AppCompatAc
  • php资源是通过引用传递的吗?

    今天我发现除了对象和基元之外 PHP 还有资源 http php net manual en language types resource php 文档说明默认情况下php 按值传递名称 http php net manual en fu
  • 为什么我的闭包函数不想在 if 语句中重新分配其父函数变量?

    我创建了这个工厂函数 用于描述游戏逻辑 我使用内部函数来切换游戏中的玩家 问题是 当我尝试从内部函数中重新分配当前玩家时 它不起作用 当前的玩家永远不会改变 我想这是关于封闭的一些事情 我并没有真正理解 你能向我解释一下我缺少什么吗 这是我