as3:此关键字的用法

时间:2009-12-27 21:06:31

标签: flex actionscript-3

我只是想知道什么时候需要使用关键字this.somevar而不只是somevar

我通常在以下情况下不使用它:

  1. 我为一个类
  2. 创建了一个私有的var
  3. 我引用它以便将其用作该类的本地变量
  4. 正确?或者这不仅仅是一种风格的东西吗?

5 个答案:

答案 0 :(得分:9)

如果您位于具有相同名称的参数并且您想要引用成员变量的函数中,则通常只需使用this.varname。成员var是否为私有对于必须使用'this'没有任何影响。

答案 1 :(得分:4)

正如已经提到的,你不需要在一个非常简单的情况下使用 this ,你想从类成员方法引用一个类成员变量,例如:

public function myClassMethod() : void
{
  // "this" is redundant here, as it is implied if omitted
  this.myPrivateOrPublicVariable = 123;
}

请注意,有些情况下 this (在程序中遇到它时进行评估,而不是像人们猜测的那样在实例化时)不会引用其中的类这个已经写完了。更具体地说,当您在将使用Function.apply()等方法调用的函数中使用它时,会发生这种情况。此方法允许调用者指定 this 将引用的对象,并且它通常用于回调,例如,在补间引擎中。

// Call myFunction(listOfArguments[0], listOfArguments[1] ...), 
// with this referring to objectReferredToByThis.
myFunction.apply(objectReferredToByThis, listOfArguments);

以下是流行的补间引擎Tweener的示例,默认行为是 this 引用补间对象(即MovieClip _mc),而不是其中的类的实例这是写的(即 MyClass )。

package
{
  /* ... imports ... */

  public class MyClass extends Sprite
  {
     private var _mc : MovieClip;

     public function tweenSomething() : void
     {
       var tween : Object = {
         x: 0,
         time: 1, 
         onComplete: function() : void {
           // Here, "this" will not refer to the instance
           // of MyClass, but rather to the _mc MovieClip,
           // which is the object being tweened below.
           this.visible = false;
         }
       };

       Tweener.addTween(_mc, tween);
     }
  }
}

在上面的代码中,使用 this 是必要的,因为我们要显式地指示运行时修改MovieClip(_mc)的可见状态。如果我们没有使用 this ,那么可见引用会引用 MyClass.visible ,因为函数已关闭。

答案 2 :(得分:3)

如果在对象内部使用它,这将引用对象本身。以下是您将使用它的示例:

package
{
    public class foo
    {
        private var variable:uint;

        public function foo(variable:uint)
        {
            this.variable = variable;
        }
    }
}

答案 3 :(得分:2)

要添加到其他答案的东西:在ActionScript 3中,您可以通过两种方式引用成员变量和函数:

// 1. the normal way
obj.var = 5;
obj.func();

// 2. the auxiliary way
obj["var"] = 5;
obj["func"]();

这似乎毫无意义,但在某些情况下,例如,将字符串连接成各种组合以在对象中使用随机的,动态指定的变量或函数可能很有用,如下所示:

private function someFunc():void
{
    obj[randomFuncStr()]();
}

private function randomFuncStr():String
{
    // randomly decide on a function to call and return its name as a String
}

但是,如果您想使用字符串来访问this内的变量或函数,该怎么办?这不起作用:

"var" = 5; // error
"func"(); // error

所以你需要做的就是:

this["var"] = 5; // the this keyword is good for something after all!
this["func"]();  // " " " " " " " " "

其他人已经提到了下一个原因,但我第一次认真对待this.varthis.func()在AS3中(而且我通常仍会谨慎地看待它的用法)就在我覆盖UIComponent.setLayoutBoundsSize(),其中包含名为width的参数和名为height的参数。 UIComponent也使用这些名称作为属性,我不喜欢在重写方法时更改参数名称。所以说this.width = x;this.height = y;之类的东西突然变得相关了。除了这两种情况之外,我认为在内部引用同一对象中的变量或函数时没有理由使用this

作为旁注,如果由于API的构建方式或其他一些非常好的理由(尽量避免自己设置这样的东西)而不得不做下一件小事,有时你可能会将this作为参数传递给函数或需要引用回调用对象的东西。

答案 4 :(得分:0)

如何开始使用this关键字,首先,它可以帮助您快速识别代码中的变量local或global(方法或类所有)。您只需要一段代码就可以看到this,然后立即意识到这是一个全局可见的类变量,而不是为目标定义添加额外的滚动。