【问题标题】:Why can this javascript function not access a variable in the same class?为什么这个javascript函数不能访问同一个类中的变量?
【发布时间】:2013-10-20 20:31:10
【问题描述】:

由于某种原因,星号行创建的 player_controller 实例变量不能在下面的 update 函数中调用。当我运行此代码时,第二个带星号的行(console.log)将识别并将指定变量从 player_controller 打印到控制台。但是,当我尝试在下面的更新函数(双星号行)中使用 player_controller 时,出现错误:“TypeError: this.player_controller is undefined.”

另请注意,如果粗体行被注释掉,其他行(具有类似创建的变量)运行不会出错。

谁能告诉我这里发生了什么?

    function Engine(){
    var GRAVITY = 0.3;

    this.map_loader = new MapLoader();
    *this.player_controller = new PlayerController();*
    this.map = this.map_loader.load_next_map();
    *console.log(this.player_controller.keys_down.A);*

    this.update = function(){
        **this.player_controller.handle_input(this.map.player);**
        gravity(this.map.player);
        this.map.player.x += this.map.player.dx;
        this.map.player.y += this.map.player.dy;
        ...
        ...

编辑:没有意识到我不能在代码块中进行格式化。

这是应用程序的链接,如果您在此页面上查看 Web 控制台,您会看到我所说的堆积错误。 http://lukescode.net/senior_project_game/main.html

【问题讨论】:

  • 您可能想创建一个SSCCE 来完美展示您的问题。
  • 如何调用更新?这就是函数中this 值的决定因素。
  • update() 在使用 engine = new Engine() 创建 Engine 对象后被 engine.update() 调用。
  • 奇怪,应该可以。很遗憾,我现在无法检查您的链接(在 iPad 上,没有控制台)。
  • 实际上 engine.update 是用setInterval(engine.update, 1000/60) 调用的,对此很抱歉。

标签: javascript function class variables public


【解决方案1】:

问题最终是我使用setInterval(engine.update, 1000/60) 调用Engine.update,正如bfavaretto 在评论中提到的那样,将“this”更改为更新函数中的引擎以外的东西。解决方案是这样调用函数:

setInterval(function(){return engine.update();}, 1000/60)

这会导致“this”正确地引用更新函数所属的对象而不是窗口。感谢 bfavaretto 为我指明了正确的方向。

【讨论】:

    【解决方案2】:

    您可能将引擎创建为

    var engine = Engine();
    

    而不是

    var engine = new Engine();
    

    【讨论】:

    • 我试过这个,它在我使用引擎类的地方给出了更多的错误,更不用说我通常希望在这个项目中遵循良好的面向对象实践。不过还是谢谢你的建议。
    猜你喜欢
    • 2020-12-28
    • 2014-10-05
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2015-10-13
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多