在内部函数中引用自己的构造函数

时间:2012-08-24 16:11:56

标签: actionscript-3 scope actionscript closures flash-player-11

这是从复杂类中提取的玩具示例:

public class MyClass {
    public function MyClass() {
         trace('Created');
    }

    public static function makeObjectAsync(callback:Function):void {
        inner();

        function inner():void {
            var object:MyClass = new MyClass(); // line 10
            callback(object);
        }
    }
}

调用静态函数后:

MyClass.makeObjectAsync(function(object:Myclass):void { ... })

以下运行时异常发生在第10行:

TypeError: Error #1007: Instantiation attempted on a non-constructor.

为什么会这样,我该怎么办?

修改

似乎new (MyClass)()有效。现在我可能更困惑了。

2 个答案:

答案 0 :(得分:1)

不清楚为什么要成为最诚实的人。它与匿名函数继承的范围有关,具体取决于它们的声明方式。

我有两个解决方案。

  1. 如果你的makeObject方法不是静态的,那就可以了。

  2. 以其他方式声明您的匿名函数:

    public static function makeObjectAsync(callback:Function):void {
        var inner : Function = function():void {
            var object:MyClass = new MyClass();
            callback(object);
        };
    
        inner();
    }
    

答案 1 :(得分:0)

您不应该调用变量“对象”。为什么要嵌套你的内在功能?你为什么不这样做:

public static function makeObjectAsync(callback:Function):void {
    callback(new MyClass());
}

或者如果你真的想要那个嵌套函数:

public static function makeObjectAsync(callback:Function):void {
    inner();

    function inner():void {
        callback(new MyClass());
    }
}

你不能再次回想起类的构造函数,使用在构造函数中调用的函数然后再次调用它。有了这个,你不是引用构造函数,而是创建类的新实例。