AS3:为啥“this”在函数内部会改变它所指的内容?
Posted
技术标签:
【中文标题】AS3:为啥“this”在函数内部会改变它所指的内容?【英文标题】:AS3: why would "this" change what it's referring to when inside a function?AS3:为什么“this”在函数内部会改变它所指的内容? 【发布时间】:2018-02-24 00:45:14 【问题描述】:我的代码
for each(var enemy in RhythmGame.npcs)
if(this.hitTestObject(enemy))
enemy.step(distance, axis, origin);
enemy.damage(power);
在我将它放入函数之前工作正常
separate();
function separate():void
for each(var enemy in RhythmGame.npcs)
if(this.hitTestObject(enemy))
enemy.step(distance, axis, origin);
enemy.damage(power);
然后我得到错误
TypeError:错误 #1006:hitTestObject 不是函数。
我发现this
在函数中指的是[object global]
,而不是它应该在的类实例中。为什么会发生这种情况?关于作用域的工作原理,我在这里有什么不明白的地方?
【问题讨论】:
诊断它:trace(this); trace(typeof(this)); trace(getQualifiedClassName(this)); trace(this is DisplayObject); 对于这两种情况并进行比较(并更新您的问题)。 好电话。它确实忘记了this
是什么。
你是否在另一个函数中定义了这个函数?
匿名(或内联)函数始终在应用程序的全局范围内。定义的函数将在声明它们的对象的范围内。尝试指定“私人功能”或“公共功能”。这是一个很好的解释:***.com/questions/33200045/…
为什么要在if(this.hitTestObject(enemy))
中使用“this”?主类代码不应该处理英雄对敌人实例的命中检测吗?这样您就可以在函数中使用您的实际实例名称(现在位于主代码中)。
【参考方案1】:
我发现 this 指的是 [object global] 当它在 函数而不是它应该是的类实例。为什么会这样 发生?关于作用域的工作原理,我在这里有什么不明白的地方?
如果您的函数是 闭包 而不是 方法,这是预期的行为。我猜你发布的代码本身包含在一个函数或类方法中,以后可能会作为回调或其他东西被调用。
来自the docs on function scope:
函数闭包和绑定方法的主要区别是 绑定方法中
this
关键字的值始终指代 它最初附加到的实例,而在 函数闭包this
关键字的值可以改变。
【讨论】:
你猜对了。它在另一个函数中,被称为 TimerEvent。以上是关于AS3:为啥“this”在函数内部会改变它所指的内容?的主要内容,如果未能解决你的问题,请参考以下文章