【问题标题】:how closure function access instance property闭包函数如何访问实例属性
【发布时间】:2012-08-08 03:11:32
【问题描述】:

代码优先

    import flash.display.Sprite;
    import flash.events.Event;

    public class TestClosure extends Sprite
    {
        private var a:Object = {'value':'test'}

        public function TestClosure()
        {
            this.addEventListener(Event.ADDED_TO_STAGE,
                function (e:Event):void
                {
                    trace(a.value);//this works
//                  trace(this.a.value);this won't work
                }
            );
        }
    }

如您所见,访问实例属性 a 没有“this”关键字会成功。

所以这是我的猜测,我不知道它是否正确。

当创建闭包函数时,编译器会寻找范围变量并创建对它的引用。

使用 a.value 会导致编译器在函数范围内寻找 a,当然 var a 是一个私有变量,它在函数范围内可用。

使用this.a.value,编译器会跳过“this”,因为它在很多情况下是动态的,只能在运行时确定。就像闭包函数“this”引用全局而不是实例一样。

感谢您的任何提示。

【问题讨论】:

    标签: actionscript-3 function actionscript closures


    【解决方案1】:

    正如您所说,在闭包函数中 this 指的是全局而不是局部范围。但是在另一个变量中创建对this 的引用会起作用:

    public function TestClosure()
    {
        var me:TestClosure = this;
    
        this.addEventListener(Event.ADDED_TO_STAGE,
             function (e:Event):void
             {
                 trace(a.value);//this works
                 trace(me.a.value); //this will work provided a is a public var
             }
        );
    }
    

    只要将a 更改为公共变量或为其创建getter 函数,trace(me.a.value); 行就会起作用。

    【讨论】:

    • 感谢您的回答,我上面帖子中的函数可以直接访问私有变量而不使用 this 或将其分配给另一个局部变量
    • 是的,但是我想我并不真正理解您最初的问题,如果在闭包周围获得对实例的引用不是您的目标。您正确地发现 this 指的是闭包中的全局范围。那么问题是什么?
    • 是的,你是对的,我的目标和我实现了它,而不像你在代码中那样将它分配给另一个变量。那么问题是背后的理论是什么?我有我的猜测,但如果它是正确的,我不知道
    • 我不知道这个理论,但它很简单:在闭包内执行trace(this),它会输出类似[global]的东西。所以基本上你不能在闭包中使用this
    • 没错,但你能解释一下为什么不使用“this”关键字,闭包仍然可以获得实例的私有变量吗?这是我看中的一点:D
    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2016-11-30
    • 2021-12-05
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多