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