【问题标题】:AS3 Functions Inside Constructors vs. Functions Outside Constructors构造函数内部的 AS3 函数与构造函数外部的函数
【发布时间】:2026-01-17 08:20:03
【问题描述】:

在新类的默认构造函数内部声明函数和在默认构造函数外部声明函数的主要区别(优点/缺点)是什么?访问修饰符是在默认构造函数之外声明函数的唯一原因吗?

谢谢。

【问题讨论】:

    标签: actionscript-3 constructor


    【解决方案1】:

    如果你是这个意思:

    public class MyClass {
        public function MyClass() {
            function myFunction() : void {
            }
        }
    }
    

    那么主要区别不仅在于可见性,还在于范围:myFunction() 被声明为临时函数,只能在同一方法中调用。构造函数执行完成后,函数被丢弃并被垃圾收集,任何临时变量也是如此。您可以轻松地验证这一点:只需添加一个“常规”成员函数并尝试从那里调用myFunction() - 编译将失败。因此,当然会尝试从另一个类访问该函数。

    如果您是指将函数声明为变量,并从构造函数中对其进行初始化,则主要区别在于类型安全。

    考虑这个标准声明:

    public class MyClass {
        public function myFunction ( param1:String ) : String {
             // doSomething
             return myString;
        }
        public function MyClass() {
        }
    }
    

    我们已经声明了一个具有严格类型参数和严格类型返回类型的成员函数。如果我们尝试以不符合声明的方式访问此函数,编译器将抛出错误,编译将失败,正如预期的那样。

    现在构造函数中的相同声明:

    public class MyClass {
        public var myFunction : Function;
        public function MyClass() {
            myFunction = function ( param1:String ) : String {
                // doSomething
                return myString;
            }
        }
    }
    

    我们声明了一个严格类型的Function 类型的成员变量,它被初始化为与上面的成员函数 做同样的事情。但它的严格类型参数和返回类型仅由编译器在声明范围内评估 - 例如,如果您尝试访问指定太多参数的函数:

    myClassInstance.myFunction ("whatever", "and", "some", "more");
    

    编译器不会抱怨,因为现在只在运行时检查参数和返回类型,而不是在编译时检查(当然,仍然会有错误)。所以这种方法的主要缺点是缺乏编译时类型检查——错误会在运行时发生,因此更难调试。

    这种方法的一个优点是我们可以随时交换这个函数:

    myClassInstance.myFunction = function ( i:int ) : void { trace (i); };
    

    这是完全合法的,显然会显着改变对象的行为。如果我们在成员函数示例中这样做,编译器也会抛出错误。

    【讨论】:

    • 感谢您详细介绍各个方面!它可以帮助我更好地了解我在做什么以及为什么要这样做。
    • 另外,类方法也是绑定函数,而属性函数不是。