2009-12-27 67 views
8

我只是想知道什麼時候需要使用關鍵字this.somevar而不是somevaras3:這個關鍵字的用法

我通常不會在下列情況下使用:

  1. 我已經做了VAR私人的一類
  2. 我指的是它爲了使用它作爲一個局部變量該類

是否正確?或者這不只是一種風格的東西?

回答

9

你一般只需要使用this.varname如果你有相同名稱參數的函數裏面,你想指成員變量。成員變量是否爲私有對於使用'this'沒有任何影響。

+0

謝謝。這清除了我希望找到的東西。 – jml 2009-12-27 22:02:20

3

如果你在一個對象內部使用它,這將引用對象本身。下面是一個例子,你會使用它:

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

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

我在說,我認爲這發生無論如何。 請參閱下面的評論;我發現它很有用。謝謝! – jml 2009-12-27 22:00:28

4

正如已經提到的,你不必在一個非常簡單的例子,你想從一個類的成員方法是指一類成員變量,例如使用這個

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

請注意,有些情況下這個(它是在程序中遇到時評估的,而不是像人們可能猜到的那樣在實例化時評估)並不指向它所寫入的類。更具體地說,當你在一個函數中使用它時,會發生這種情況,該函數將使用諸如Function.apply()之類的方法進行調用。這種方法允許呼叫者指定將由這個引用的對象,並且它通常在回調中使用,例如,在補間引擎。

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

下面是與流行的漸變引擎中間人,其中默認行爲是有這個指補間對象(即影片剪輯_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); 
    } 
    } 
} 

在上面的代碼,使用是必要的,因爲我們要明確地指示運行時修改我們的影片剪輯(_mc)的可見狀態。如果我們沒有使用這個,可見的參考因爲函數關閉而會參考MyClass.visible

+0

感謝您進入這個細節。 我讚賞澄清。 – jml 2009-12-28 17:25:42

+0

嗯,我不明白爲什麼在這個tweener例子。指的是動畫片段。 – Rihards 2010-08-13 04:12:47

+0

@Richards,它的確如此,因爲調用者(在Tweener中)指定補間目標爲「this」變量引用。請參閱有關Function.apply()的文檔。乾杯 – richardolsson 2010-08-17 14:57:36

0

如何開始使用this關鍵字,首先,它可以幫助您快速識別代碼中的變量local或global(方法或類擁有)。您只需要一段代碼即可看到this,然後立即意識到這是一個全局可見的類變量,而不是目標定義的額外滾動。

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 
} 

但是如果你想使用字符串來訪問內部變量或函數是什麼?這不起作用:

"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作爲參數傳遞給函數或需要引用回調用對象的東西。