至于 arguments.length 没什么可说的, 就是返回当前调用所传递的参数个数.
函数的其它特性 局部变量 在函数中使用的参数都是局部变量, 在函数调用结束后它们会被自动从内存中移除. 你也可以在函数中使用 var 声明其它的局部变量. 如果你在函数中使用了全局或是其它位置的变量, 一定要注意是否和函数中的局部变量混淆, 同时最好用注释标明它们不是函数的局部变量和它们的来源.
function test(a) { var b = "Words"; //定义局部变量 b c = "Text Here"; //定义变量 c
trace("----从内部访问变量----"); trace("a="+a); //显示参数 a trace("b="+b); //显示局部变量 b trace("c="+c); //显示变量 c }
//调用函数 test("Symbol");
trace("----从外部访问变量----"); trace("a="+a); trace("b="+b); trace("c="+c); 由运行结果可以看出来参数 a 和局部变量 b 都只在函数体内可以访问, 而在函数内部定义的变量 c 则可以在函数体外部访问.
作用域 函数的作用域是定义它的代码所在的对象或时间线范围. 全局函数其实相当于一个基于 _global 全局对象的子函数.
如果要调用其它位置(即不在同一对象层内的函数), 必须使用路径(Path). 如在一个子 MovieClip 中要调用 _root 中的函数必须要用以下格式:
_root.myFunction(); 若是要调用父级 MovieClip 下面的 mc1 里面的 mc2 里面的函数 myFunction 则要用以下代码:
_parent.mc1.mc2.myFunction(); 说得更明确一点, 就是你在一个对象或是层级中定义了一个函数, 就等于为这个对象(或者说是类, Class)或层级增加了一个子函数(或是方法, Method). 要调用这个函数, 你就必须指明它所属的对象或是层级. 这也使得在不同的对象中可以用相同的函数名来创建函数(变量和对象也是一样). 关于路径的内容将后面的章节提到.
函数的重定义 在 ActionScript 中, 当你重新定义了一个函数后, 这个函数就会被改写为新的版本, 旧的函数被覆盖. 你再次调用它时, 它就是新的函数了. 至于函数重载(C++ 的特色)这种东西在 ActionScript 中是没有的, 所以也不用费力气讲了.
关于函数的内容就简要介绍到这里. 在下一章我们会讨论在实际应用中非常有用的数组.
第 5 章: 数组 什么是数组? 终于写完了数据类型, 条件循环语句以及函数部分, 现在可以讲讲数组了.
那么, 什么是数组呢? 我也不懂该怎么定义. 所以就从 C++ 的教材上抄了一段: 数组由许多相同类型的数据项和索引变量组成, 数组不是一种基本数据类型, 它是由数据类型组成的集合类型.
算了, 这么多字, 人都会被绕糊涂, 还是来个大概吧: 数组就是许多对象的集合, 对象的类型可以为数值, 字符串, 其它对象等等. 你可以通过每个元素的序号(叫做索引, index)来访问指定的元素. 它的功能同变量一样, 也是存贮数据的地方, 只不过是一个"集中营"而已.
ActionScript 中的数组其实是系统内建的对象类型, 之所以要将它的对象性提前到这里讲, 是因为它的用途非常广泛(也因为在 C++ 的教材里面它被放在基础部分). 譬如说, 你可以用它来存贮一个名单或是一系列坐标等.
创建数组 到现在为止还没有让大家看看数组长什么样, 是不是值得花那么多时间学, 那么, 就让我们看看它的真面目吧:
team_member = new Array(); team_member[0] = "SiC"; team_member[1] = "ReDo"; team_member[2] = "Crab_D";
trace(team_member); //显示数组内容 上面就是数组 team_member 的定义语句, 它定义了一个包含 3 个字符串的数组(即数组长度为 3). 给它赋值的语句中, 在team_member 后面的方括号里是每个元素的索引(索引由 0 开始). 其实例子中是通过 new 关键字创建一个 Array 对象的实例, 这些我们会在有关对象的章节中提到, 这里请你先记住它.
同 C 和 Java 一样, ActionScript 中的数组索引也是由 0 开始的. 在编程时应特别注意, 因为这也是初学者的常见错误之一.
如果你觉得上面的语句太繁琐, 那么上面的例子可以改为如下形式:
team_member = new Array("SiC", "ReDo", "Crab_D");
trace(team_member); //显示数组内容 它的作用与上例相同, 只不过更简洁一点. 如果要更简捷, 就用下面的方法:
team_member = ["SiC", "ReDo", "Crab_D"];
trace(team_member); //显示数组内容 注意, 这里代码中用的是方括号. 今后使用数组时可以根据具体情况选用不同的方法, 不过用得最多的还是这种.
至于用 new Array(数组长度) 创建指定长度的空数组, 因为实用价值不高(虽然在读取外部数据时可能会用到), 而且也很容易理解, 所以就不讨论了, 其方法是一样的.
--------------------------------------------------------------------------------
有时候我们希望在一个元素中包含多个元素(即元素又是一个数组), 这时候就要用到多维数组了.
对于多维数组, 最简单的创建方法就是使用方括号:
//不要忘了下面的 var 代表着什么, 如果真的忘了就看看数据类型那一章 var team_member = [[ "SiC", "无业游民", 1011 ], [ "ReDo", "游戏杀手", 2172 ], [ "Crab_D", "帮倒忙", 1012 ]];
trace(team_member.join("\n")); //显示数组内容 每个元素(即子数组)在 trace 输出时用 \n (换行符)分隔开. 另外在每个子数组中的元素数目也可以不相同, 这里就不举例了.
访问数组 其实访问数组的方法很简单, 第一个例子的赋值语句就已经表明了这一点. 要修改数组中某个元素的值, 只需要用 数组名[索引号] = 新值; 的格式赋值. 如果要像变量一样引用某一个元素, 只需要用 数组名[索引号] 来表示该元素就行了. 对于多维数组, 格式为 数组名[索引号1][索引号2][索引号3]...(有多少个方括号就看你要访问的是那一级的数组元素了). 下面是一个简单的例子:
var team_member = [[ "SiC", "无业游民", 1011 ], [ "ReDo", "游戏杀手", 2172 ], [ "Crab_D", "帮倒忙", 1012 ]];
team_member[1] = [ "UnDo", "游戏白痴", 2171]; //修改第 2 个元素(子数组) team_member[2][1] = "关心"; //修改 "帮倒忙" 为 "关心"
trace(team_member.join("\n")); //显示数组内容
有一点方便普通用户的功能是: ActionScript 的数组对象是动态的, 没有 C 语言中静态数组和动态数组的分别(毕竟不会复杂到让用户分配内存的地步). 也就是说, 你可以很方便的任意添加或移除数组元素:
team_member = new Array("SiC", "ReDo", "Crab_D"); //原来只有 3 个元素 team_member[3] = "You"; //添加第 4 个元素, 注意索引为 4-1=3
trace(team_member); //显示数组内容 上例为数组添加了第 4 个元素 "You" (请注意不是第 3 个, 索引号是从 0 开始的). 从 trace 的结果可以看出这一点.
--------------------------------------------------------------------------------
对于多维数组, 只能通过父级元素添加新元素(注意新添加的元素可以有不同数目的子元素):
var team_member = [[ "SiC", "无业游民", 1011 ], [ "ReDo", "游戏杀手", 2172 ], [ "Crab_D", "帮倒忙", 1012 ]];
team_member[3] = ["You", "Unknown"]; //添加新元素 team_member[0][3] = ["Yeah!"]; //添加一个新的子数组到已有元素(子数组) team_member[0][3][1] = "Hmm?"; //添加一个新元素到新的子数组中 trace(team_member.join("\n")); 上面的例子不能用 trace 的结果表现出 "Yeah!" 和 "Hmm?" 构成的子数组(它们被紧接着父数组显示出来了, 而且也是用逗号分隔). 你可以在 Debug Movie (调试动画, Ctrl+Shift+Enter) 中用 Debugger (调试)窗口的 Variables (变量)页面查看 _level0 中 team_member 数组的内容. 注意, 进入 Debug 模式后动画是暂停的, 数组还没有定义, 要按 F8 运行后才能查看其内容.
ActionScript 中的数组有个很特殊的优点: 可以使用字段名. 这样的数组更像一个二维数据表(但实际上这是个对象的数组, 注意在定义每个子元素时使用的是大括号而不是中括号).
var team_member = new Array(); team_member[0] = {name: "SiC", job: "无业游民", sn: 1011}; team_member[1] = {name: "ReDo", job: "游戏杀手", sn: 2172}; team_member[2] = {name: "Crab_D", job: "帮倒忙", sn: 1012};
trace(team_member[1].name); //显示第 2 个元素中的 name 字段
后面的 trace 语句显示第二个元素的 name 字段的内容. 但实际上这是通过 team_member[1] 引用数组的第二个元素(一个对象), 然后通过点式语法引用其属性 name 的值. 你可以通过 Debugger 来查看这个数组的内容. 关于对象的具体内容将在后面章节中说明.
数组对象(Array) 在前面我们提到数组也是系统内建对象, 那么现在我们要讨论一下作为对象的数组有什么特殊性质.
作为一个对象, 自然会有一些属性(Property)和方法(Method)可供使用. 下面就是它们的列表:
属性 描述 Array.length 返回数组长度 方法 描述 Array.concat 连接指定数组和参数中的各个数组成为新的数组并返回. Array.join 将数组中所有元素连接成为一个字符串. Array.pop 移除数组的最后一个元素并返回它的值. Array.push 在数组末尾添加一个元素并返回新的数组长度. Array.reverse 反转数组元素. (相当方便, 特别是在写某些特效时) Array.shift 移除数组的第一个元素并返回它的值. Array.slice 将数组的指定部分以一个新的数组返回. (不影响原数组) Array.sort 对数组排序. (免去了另写排序函数的必要) Array.sortOn 按字段名对数组排序. Array.splice 添加和/或移除数组元素. Array.toString 返回以逗号 "," 分隔的数组元素列表字符串. Array.unshift 在数组开头添加一个或多个元素并返回新的数组长度.
这里面最常用的是 length 属性. 在写循环时, 有时我们不能确定要处理数组的元素数目, 这时候就可以通过 length 属性获得其数目. 至于其它的那些方法, 在用到的时候查查帮助和参考里面的详细信息就够了.
//显示数组内容的函数 function show_member(comment) { if (my_team != undefined) { //确认数组是否存在 trace(my_team.join(" , ") add " << " add comment); //在数组内容后面我加了个注释, 便于在输出时辨认 } else { trace("数组未定义!"); } }
//为数组元素添加序号的函数 function add_number(the_array) { if (the_array != undefined && the_array.length>2) { //确认数组存在并且长度大于 2 for (i=0; i<the_array.length; i++) { //用 length 属性来作为判断条件 the_array[i] = i add ": " add the_array[i]; //这里的运算符看不懂就回头看看第一章 } } else { trace("数组不存在或只有一个元素!"); } }
//测试函数工作是否正常 show_member(); add_number(my_team);
//创建数组 my_team = new Array(); my_team = ["SiC", "ReDo", "Crab_D"]; show_member("有 3 个元素");
//调用数组对象的 splice 方法, 删除 ReDo, 添加 UnDo 和 EdeN //第一个参数为要删除的第一个元素的 index, 第二个参数为要删除的元素个数 //后面的参数是要在删除的位置添加的元素 my_team.splice(1, 1, "UnDo", "EdeN"); show_member("调用 splice 方法修改后的数组")
//调用函数处理数组 add_number(my_team); show_member("添加了序号后的数组");
//反向数组 my_team.reverse(); show_member("反向后的数组");
//去掉第一个和最后一个元素 my_team.shift(); my_team.pop(); show_member("去掉头尾元素的数组");
//在开头添加元素 my_team.unshift("6: Doggie", "7: Zero"); show_member("在开头添加元素");
//在末尾添加元素 my_team.push("7: Who?", "0: Ghost"); show_member("在末尾添加元素");
//按升序排序, 要降序只需再调用一个 reverse 方法即可 my_team.sort(); show_member("排序后数组"); 上面的这个例子就比我们以往的例子要长一些了. 首先看看最前面我们声明的两个函数.
第一个函数主要通过 trace 输出数组的内容., 我使用了一个 join 方法将数组元素用指定字符连接并以字符串形式返回. 为了保证不会因为传递给函数的数组参数名称错误或定义失败而产生错误, 我在输出前用了一个条件语句来判断参变量是否 undefined (未定义, 回想一下前面在数据类型介绍中提到的内容).
第二个函数主要是演示 length 属性的使用. 其中的 for 循环通过使用 length 属性判断是否到达数组尾. 由于 length 会随所给数组的不同而变化, 所以 for 循环可以处理任意长度的数组, 而不必担心出现下标越界问题(即调用数组元素时使用了过大或过小的索引值).
在后面紧接着的是测试函数工作是否正常的语句. 我故意在数组还未定义时就调用这两个函数, 结果返回了函数里我们预先设定的错误信息(如果函数没有判断参数是否已定义的部分, Flash 也会返回错误信息).
然后就是测试的主体部分. 这些部分特别需要解释的, 自己看注释就行了. 关于其中用到的 splice 方法可以查询 Flash 的 ActionScript Dictionary 或是 References 面板. 今后在别人的代码中发现不熟悉的东西时, 要懂得利用 Flash 本身附带的帮助文件.
然后, 关于数组的内容也就简单地介绍到这里了. ActionScript 的基础部分到此结束, 后面是面向对象的内容.
|