2014-12-25 69 views
0

我打了周圍的一些匿名的功能,我發現這個代碼不跟蹤兩次同樣的事情:AS3 - 匿名函數「這個」

public function Main() 
    { 
     trace(this); 

     stage.addEventListener(MouseEvent.CLICK, function(e:Event):void 
     { 
      trace(this); 
     }); 
    } 

第一個跟蹤痕跡「[對象主要]」第二個跟蹤「[全球對象]」(點擊後)。爲什麼會發生?什麼是全球對象,對某些東西有用?

回答

1

匿名函數允許您創建的變化與行爲,而無需創建一個子類,或者一些複雜的switch語句,所以你現在可以簡單地分配功能,在運行時執行特定任務。就像任何變量 - 只有這種特殊類型的變量沒有值,而是行爲。

//clasic 
bar = function(arg1, arg2, etc) { 
    // do something here  
} 
當你 trace(this)

參考,哪些函數返回,這是一個特殊的全局「酒吧」變量。
這是一個事件監聽器的標準示例,但您也可以將其應用於您所需的任何其他功能。

你可以在這裏找到關於匿名函數:http://blogs.adobe.com/simplicity/2007/10/post.html

2

在這種情況下,關鍵字this代表global object,它是創建函數的某個備用Universe,因爲它是在任何自定義類或對象之外定義的。

Main類

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.MouseEvent; 

    public class Main extends MovieClip 
    { 
     public function Main() 
     { 
      // trace(this); 
      stage.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void 
      { 
       trace(this); 
      }); 
     } 
    } 
} 

輸出

[object global] 

在下面的例子中,函數聽者toClick被定義爲method of the Main class,所以thisobject Main

正確的代碼

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.MouseEvent; 

    public class Main extends MovieClip 
    { 
     public function Main() 
     { 
      // trace(this); 
      stage.addEventListener(MouseEvent.CLICK, toClick); 
     } 

     private function toClick(e:MouseEvent):void 
     { 
      trace(this); 
     } 
    } 
} 

輸出

[object Main]