Actionscript 3 函数是否分配给全局范围内定义的方法中的变量?

Actionscript 3 函数是否分配给全局范围内定义的方法中的变量?,actionscript-3,flash,actionscript,Actionscript 3,Flash,Actionscript,函数是否在全局范围内定义的方法中分配给变量 我通常不使用嵌套函数闭包,因为它们存在垃圾收集问题——即如何在“激活对象”中保留来自“词汇环境”的周围依赖项,并将它们保持在全局范围内 如果我将嵌套函数闭包存储到函数内部的局部变量中,这是否会使垃圾收集器以不同的方式处理它们 foo1()与fooVar()基本相同吗 (听起来答案是“是的”,根据。)这与变量非常相似,但我不能说它们被分配给了一个。这里有点棘手,因为我们不能谈论函数作为一个整体,因为其中一些是动态创建的,而另一些不是 例如,您无法清除在具

函数是否在全局范围内定义的方法中分配给变量

我通常不使用嵌套函数闭包,因为它们存在垃圾收集问题——即如何在“激活对象”中保留来自“词汇环境”的周围依赖项,并将它们保持在全局范围内

如果我将嵌套函数闭包存储到函数内部的局部变量中,这是否会使垃圾收集器以不同的方式处理它们

foo1()
fooVar()
基本相同吗


(听起来答案是“是的”,根据。)

这与变量非常相似,但我不能说它们被分配给了一个。这里有点棘手,因为我们不能谈论函数作为一个整体,因为其中一些是动态创建的,而另一些不是

例如,您无法清除在具有名称的类中定义的函数,如示例中的myMethod(老实说,我没有尝试过,但我99%确定这是真的,如果我错了,也许有人可以帮助我)。但你可以解决一个问题。都是关于推荐信的。是的,如果清除对闭包的引用,它将被标记为垃圾收集,因此不会占用内存

更糟糕的不是函数本身,而是您定义的变量,因为函数的作用域链。如果您没有正确使用闭包,那么这些变量将保持活动状态,并且永远不会被垃圾收集

这里有一篇关于闭包和作用域的老文章,现在仍然有效:

我希望这能给你一些信息,因为解释起来并不容易:)

长话短说:

  • 否。作用域中未存储函数定义或变量。它们的引用可以被声明

  • 在编译时,如果闭包没有声明,编译器将在封闭方法作用域中查找该声明

  • 否。GC是关于检查引用的。如果global通过引用知道该实例,则无论该实例是否知道该全局实例,该实例都是安全的。否则,就不是了

  • 在您的示例中,
    函数foo1():void{..}
    是声明和赋值的组合
    var fooVar:Function
    是声明,
    =Function()…
    是赋值。基本上,,除了您在
    fooVar
    末尾忘记了
    :void


让我来帮你澄清你的想法:
(根据你的问题,我认为你很接近答案,但只是有点困惑。)

任何方法,包括闭包,都有自己相同/独立的作用域。
this
关键字是引用其他范围中事物的一种方式

此外,变量和函数定义的值存储在内存的不同位置,而不是任何范围

假设您有这样一个函数:

private function test():void
{
    new MyObject();
}
内部MyObject的实例从未分配,根本没有作用域。但是,如果运行该方法,它实际上存在于内存中,就在垃圾收集之前不久。(您可以尝试使用探查器来确认这一点。)

特别是函数定义是固定的,不需要重复,它们存在于静态存储区域中

所以,不管怎样,总之,不要担心。他们不会在任何通用flash player/air运行时出错


此外,

当然,在您的示例中,您可以说
myMethod()
在其父范围内;因为它是具体地声明和分配的。(编译器还将
this
关键字固定到其父级,这样您就不能通过使用
Function.call(thisObj)
来更改它,这与闭包不同。)

但严格地说,一般来说,当你说“某个范围内的某物”时,你不是指占有,除非它是一种具体的方法

private function test():void
{
    new MyObject();
}