【问题标题】:Why is this for-loop (on an object) messing up?为什么这个 for 循环(在一个对象上)搞砸了?
【发布时间】:2021-08-12 22:24:00
【问题描述】:

我在这里有一个 for-loop,这让我非常困惑,因为它抛出 cannot read property of null,即使它直接来自循环......

TypeError: Cannot read property 'eventManager' of null
HTMLDocument.eventManager
src/jsgame/game.js:30
  27 | 
  28 | eventManager(event) {
  29 |   for (let key in this) {
> 30 |     if (typeof this[key].eventManager === 'function') {
  31 | ^       this[key].eventManager(event);
  32 |     }
  33 |   }

如果你明白我想要做什么,你有什么更好的方法来做这件事吗?

【问题讨论】:

  • 第一件事可能是在 console.log("key", key) 之前添加一行 - 这将告诉您它正在寻找但找不到的对象。也许您正在不按顺序加载此文件
  • 添加您在哪里拨打eventManager 以及如何拨打电话。还要添加您正在使用的整个示例。
  • @Kinglish 啊,所以我在 addEventListener 中调用它,它肯定没有在正确的对象中查找?我该如何解决这个问题?
  • @Ayzrian 我在 document.addEventListener 中引用它。
  • 请添加最小可重现示例,例如包含eventManager 函数的类和使用它的代码。

标签: javascript for-loop object


【解决方案1】:

发现问题。我是这样引用它的... document.addEventListener('keydown', game.eventManager).

解决方案: document.addEventListener('keydown', (event) => game.eventManager(event))

【讨论】:

  • 谁能给我解释一下这个?我对 JavaScript 的理解表明这些语句之间没有真正的区别——唯一的区别是第二个语句(解决方案)定义了一个新的内联函数,第一个是传递一个函数。为什么这条线会导致这个问题?
  • 没关系发现问题 - 除非您 eventManager = eventManager.bind(game) 或在类中定义函数以隐藏绑定调用,否则不会定义 this。话又说回来,没有足够的代码可以肯定地知道这一点。
  • @RichardBarker 是的,我相信你是对的;游戏类构造函数中的this.eventManager = this.eventManager.bind(this) 也可以。
  • 假设您有 class Game ... 定义了 eventManager(在构造函数中或作为函数),那么它也应该很好 - 引擎应该自动绑定函数或字段。没有代码,还有其他事情很难看到。但你让它工作了,所以我想这很好。
猜你喜欢
  • 1970-01-01
  • 2012-02-29
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
相关资源
最近更新 更多