为什么这个javascript函数不能访问同一个类中的变量?

为什么这个javascript函数不能访问同一个类中的变量?,javascript,function,class,variables,public,Javascript,Function,Class,Variables,Public,由于某些原因,无法在下面的更新函数中调用在星号行上创建的player_控制器实例变量。当我运行此代码时,第二条带星号的行(console.log)将识别并将指定的变量从player_控制器打印到控制台。但是,当我尝试在下面的更新函数(双星号行)中使用player\u controller时,我得到一个错误:“TypeError:this.player\u controller未定义。” 还要注意,如果粗体行被注释掉,其他行(具有类似创建的变量)运行时不会出现错误 谁能告诉我这里发生了什么事

由于某些原因,无法在下面的更新函数中调用在星号行上创建的player_控制器实例变量。当我运行此代码时,第二条带星号的行(console.log)将识别并将指定的变量从player_控制器打印到控制台。但是,当我尝试在下面的更新函数(双星号行)中使用player\u controller时,我得到一个错误:“TypeError:this.player\u controller未定义。”

还要注意,如果粗体行被注释掉,其他行(具有类似创建的变量)运行时不会出现错误

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

    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控制台,你会看到我所说的堆积错误

您可能将引擎创建为

var engine = Engine();
而不是

var engine = new Engine();

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

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


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

我尝试了这个方法,在我使用engine类的地方出现了更多错误,更不用说我通常希望在这个项目中遵循良好的面向对象实践。不过,谢谢你的建议。你可能想创建一个应用程序来完美地演示你的问题。如何调用更新?这就是函数中的
值的决定因素。在使用
engine=new engine()
创建引擎对象后,将使用
engine.update()
调用函数中的
值。奇怪的是,应该可以这样做。很遗憾,我现在无法检查您的链接(在iPad上,没有控制台)。实际上,engine.update是通过
setInterval(engine.update,1000/60)调用的。
对此表示抱歉。