Flash CS3 文档 |
|||
| ActionScript 3.0 编程 > ActionScript 语言及其语法 > 函数 > 函数作用域 | |||
函数的作用域不但决定了可以在程序中的什么位置调用函数,而且还决定了函数可以访问哪些定义。适用于变量标识符的作用域规则同样也适用于函数标识符。在全局作用域中声明的函数在整个代码中都可用。例如,ActionScript 3.0 包含可在代码中的任意位置使用的全局函数,如 isNaN() 和 parseInt()。嵌套函数(即在另一个函数中声明的函数)可以用在声明它的函数中的任意位置。
无论何时开始执行函数,都会创建许多对象和属性。首先,会创建一个称为“激活对象”的特殊对象,该对象用于存储在函数体内声明的参数以及任何局部变量或函数。由于激活对象属于内部机制,因此您无法直接访问它。接着,会创建一个“作用域链”,其中包含由 Flash Player 检查标识符声明的对象的有序列表。所执行的每个函数都有一个存储在内部属性中的作用域链。对于嵌套函数,作用域链始于其自己的激活对象,后跟其父函数的激活对象。作用域链以这种方式延伸,直到到达全局对象。全局对象是在 ActionScript 程序开始时创建的,其中包含所有的全局变量和函数。
“函数闭包”是一个对象,其中包含函数的快照及其“词汇环境”。函数的词汇环境包括函数作用域链中的所有变量、属性、方法和对象以及它们的值。无论何时在对象或类之外的位置执行函数,都会创建函数闭包。函数闭包保留定义它们的作用域,这样,在将函数作为参数或返回值传递给另一个作用域时,会产生有趣的结果。
例如,下面的代码创建两个函数:foo()(返回一个用来计算矩形面积的嵌套函数 rectArea())和 bar()(调用 foo() 并将返回的函数闭包存储在名为 myProduct 的变量中)。即使 bar() 函数定义了自己的局部变量 x(值为 2),当调用函数闭包 myProduct() 时,该函数闭包仍保留在函数 foo() 中定义的变量 x(值为 40)。因此,bar() 函数将返回值 160,而不是 8。
function foo():Function
{
var x:int = 40;
function rectArea(y:int):int // 定义函数闭包
{
return x * y
}
return rectArea;
}
function bar():void
{
var x:int = 2;
var y:int = 4;
var myProduct:Function = foo();
trace(myProduct(4)); // 调用函数闭包
}
bar(); // 160
方法的行为与函数闭包类似,因为方法也保留有关创建它们的词汇环境的信息。当方法提取自它的实例(这会创建绑定方法)时,此特征尤为突出。函数闭包与绑定方法之间的主要区别在于,绑定方法中 this 关键字的值始终引用它最初附加到的实例,而函数闭包中 this 关键字的值可以改变。有关详细信息,请参阅绑定方法。
Flash CS3
当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000057.html