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”在函数内部会改变它所指的内容?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中的 this 关键字

为啥我的变量在函数内部修改后没有改变? - 异步代码参考

为啥我的变量在函数内部修改后没有改变? - 异步代码参考

为啥我的变量在函数内部修改后没有改变? - 异步代码参考

为啥我的变量在函数内部修改后没有改变? - 异步代码参考

为啥我的变量在函数内部修改后没有改变? - 异步代码参考