Actionscript 3 什么是[对象全局性],何时;这";是否在嵌套函数或内联函数中访问?

Actionscript 3 什么是[对象全局性],何时;这";是否在嵌套函数或内联函数中访问?,actionscript-3,actionscript,Actionscript 3,Actionscript,代码如下: package { import flash.events.*; import flash.display.*; public class SomeDocumentClass extends MovieClip { public var abc: MovieClip; public var test_var = 12345; public function SomeDocumentClass() {

代码如下:

package {
    import flash.events.*;
    import flash.display.*;

    public class SomeDocumentClass extends MovieClip {

        public var abc: MovieClip;
        public var test_var = 12345;

        public function SomeDocumentClass() {
            //abc is an instance name of a movieclip placed on stage
            abc.addEventListener(MouseEvent.CLICK,
                function () {
                    trace(this); 
                });
            abc.addEventListener(MouseEvent.CLICK, abc_CLICK)
        }

        function abc_CLICK(e: Event): void {
            trace(this); 
        }

    }

}
输出为:

[对象全局]

[对象类]

我还检查了,
[object global]
甚至不是函数本身。那么它是什么呢?

匿名函数(也称为函数表达式)是全局作用域,而定义的函数(也称为函数语句)是局部作用域

匿名函数

  • 不能用作方法
  • 仅在定义它的范围内存在
  • 只能在定义它的范围内调用
  • 可以在代码中的任意点调用
  • 可以重新分配新值或删除
定义的功能

  • 可以用作对象的方法
  • 存在于定义它的对象中
  • 可以在代码中的任意点调用
  • 无法删除或更改
例如:

这是匿名函数中的

[trace] [object global]
[trace] global
[trace] <type name="global" base="Object" isDynamic="true" isFinal="true" isStatic="false">
[trace]   <extendsClass type="Object"/>
[trace]   <constant name="FLASH10_FLAGS" type="uint" uri="avmplus"/>
~~~~~~~~~~~~
[trace]   </method>
[trace] </type>
ActionScript剪切/粘贴完整示例:

package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import avmplus.getQualifiedClassName;
    import flash.utils.describeType;

    public class Main extends Sprite {
        var button:CustomSimpleButton;

        public function Main() {
            button = new CustomSimpleButton();
            button.addEventListener(MouseEvent.CLICK,
                    function () {
                        trace(this);
                        trace(getQualifiedClassName(this));
                        trace(describeType(this));
                    });
            button.addEventListener(MouseEvent.CLICK, onClickButton);
            addChild(button);
        }

        function onClickButton(event:MouseEvent):void {
            trace(this);
            trace(getQualifiedClassName(this));
            trace(describeType(this));
        }
    }
}

import flash.display.Shape;
import flash.display.SimpleButton;

class CustomSimpleButton extends SimpleButton {
    private var upColor:uint   = 0xFFCC00;
    private var overColor:uint = 0xCCFF00;
    private var downColor:uint = 0x00CCFF;
    private var size:uint      = 80;

    public function CustomSimpleButton() {
        downState      = new ButtonDisplayState(downColor, size);
        overState      = new ButtonDisplayState(overColor, size);
        upState        = new ButtonDisplayState(upColor, size);
        hitTestState   = new ButtonDisplayState(upColor, size * 2);
        hitTestState.x = -(size / 4);
        hitTestState.y = hitTestState.x;
        useHandCursor  = true;
    }
}

class ButtonDisplayState extends Shape {
    private var bgColor:uint;
    private var size:uint;

    public function ButtonDisplayState(bgColor:uint, size:uint) {
        this.bgColor = bgColor;
        this.size    = size;
        draw();
    }

    private function draw():void {
        graphics.beginFill(bgColor);
        graphics.drawRect(0, 0, size, size);
        graphics.endFill();
    }
}

这是内联函数中的结果,因为它在任何地方都没有作用域(它是应用程序的顶级作用域)。不要使用内联函数,使用它们几乎没有任何好处。也许这可以帮助你理解:
package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import avmplus.getQualifiedClassName;
    import flash.utils.describeType;

    public class Main extends Sprite {
        var button:CustomSimpleButton;

        public function Main() {
            button = new CustomSimpleButton();
            button.addEventListener(MouseEvent.CLICK,
                    function () {
                        trace(this);
                        trace(getQualifiedClassName(this));
                        trace(describeType(this));
                    });
            button.addEventListener(MouseEvent.CLICK, onClickButton);
            addChild(button);
        }

        function onClickButton(event:MouseEvent):void {
            trace(this);
            trace(getQualifiedClassName(this));
            trace(describeType(this));
        }
    }
}

import flash.display.Shape;
import flash.display.SimpleButton;

class CustomSimpleButton extends SimpleButton {
    private var upColor:uint   = 0xFFCC00;
    private var overColor:uint = 0xCCFF00;
    private var downColor:uint = 0x00CCFF;
    private var size:uint      = 80;

    public function CustomSimpleButton() {
        downState      = new ButtonDisplayState(downColor, size);
        overState      = new ButtonDisplayState(overColor, size);
        upState        = new ButtonDisplayState(upColor, size);
        hitTestState   = new ButtonDisplayState(upColor, size * 2);
        hitTestState.x = -(size / 4);
        hitTestState.y = hitTestState.x;
        useHandCursor  = true;
    }
}

class ButtonDisplayState extends Shape {
    private var bgColor:uint;
    private var size:uint;

    public function ButtonDisplayState(bgColor:uint, size:uint) {
        this.bgColor = bgColor;
        this.size    = size;
        draw();
    }

    private function draw():void {
        graphics.beginFill(bgColor);
        graphics.drawRect(0, 0, size, size);
        graphics.endFill();
    }
}