http://blog.csdn.net/Begin_Game/archive/2008/10/15/3081317.aspx
一:for each ... in与 for..in 一样都是自动遍历对象的属性,不同的是for each...in 更像是为遍历保存键值对的集合而产生的,而这些集合的类型可以是未声明类型的对象,甚至XML文件,而在遍历时循环中的循环变量类型声明是用"*"号来表示,意为任意类型。1:遍历未声明类型对象:var arr:Object = {1:"jack",2:2046};for each(var i:* in arr){ trace(i);}/-----jack2046

2:遍历XML:
var xml:XML = <beans>
    <bean>jack</bean>
    <bean>2046</bean>
     </beans>;
for each(var item:* in xml.bean)
{
 trace(item);
}
/-----
jack
2046

二:break的特殊用法:
在AS3中,由于其作用于动画的特殊性,孕生出很有意思的的label标签用法。此label标签不能独立存在,必须依赖break、continue两个跳转关键字进行使用。
gotoout:for(var i:int = 0; i < 10; i++)
  {   
   for(var j:int = 0; j < 10; j++)
   {
    trace("i:" + i + ",j:" + j);
    if((i==0)&& (j==8)){
     break gotoout;
    }
   }   
  }
/-----
i:0,j:0
i:0,j:1
i:0,j:2
i:0,j:3
i:0,j:4
i:0,j:5
i:0,j:6
i:0,j:7
i:0,j:8

在这里gotoout标签包含了一个嵌套for循环,之中退出条件为 i=0 && j==8 时,则跳转出整个循环;如换为continue则为:
gotoout:for(var i:int = 0; i < 10; i++)
  {   
   for(var j:int = 0; j < 10; j++)
   {    
    if((i==0)&& (j==8)){
     trace("跳过第i:" + i + "  j:" + j +"次循环");
     continue gotoout;
    }
    else
    {
     trace("i:" + i + ",j:" + j);
    }
   }
   if((i==1))
   {
    break;
   }
  }
/---------
i:0,j:0
i:0,j:1
i:0,j:2
i:0,j:3
i:0,j:4
i:0,j:5
i:0,j:6
i:0,j:7
跳过第i:0  j:8次循环
i:1,j:0
i:1,j:1
i:1,j:2
i:1,j:3
i:1,j:4
i:1,j:5
i:1,j:6
i:1,j:7
i:1,j:8
i:1,j:9

当然也不一定是循环才能使用breank,但continue一定要配合循环使用
break:
trace("1");
gotoout:{
 trace("2");
 trace("3");
 break gotoout;
 trace("4");
 trace("5");
}
/-------
trace("1");
gotoout:{
 trace("2");
 trace("3");
 break gotoout;
 trace("4");
 trace("5");
}

continue:
trace("1");
gotoout:{
 trace("2");
 trace("3");
 continue gotoout;
 trace("4");
 trace("5");
}
/-------
1039: 找不到 continue 语句的目标。

标签也可嵌套使用,但无论嵌套几层,最终跳出哪层标签由 break 标签名 决定的
trace("1");
gotoout:{
 gotoout1:{
  gotoout2:{
   trace("2");
   trace("3");
   break gotoout2;
   trace("4");
   trace("5");
  }
  trace("gotoout1");
 }
 trace("gotoout");
}
/------
1
2
3
gotoout1
gotoout

如break gotoout2 换成 break gotoout ,则程序会直接跳出gotoout标签,不会打印 gotoout1、gotoout。

三:局部变量可当全局变量使用
AS3的代码编译是提交给Flash Play优化后编译,因此会出现在java和C++中不可想象的状况。
for(var i:int =1; i<=3; i++)
{
 var str:String = "你好,正在循环";
 trace(i + ":循环内:" + str);
}
trace("循环外:" + str);
/-----
1:循环内:你好,正在循环
2:循环内:你好,正在循环
3:循环内:你好,正在循环
循环外:你好,正在循环

可以看到str是在for循环开始后在循环内部声明并赋值的,但在循环结束后在循环外部依然正常使用了str这个变量,这是由于代码在编译过程中编译器将声明前置优化了。
var str:String;
.......

因此无论将var str:String 放在代码块的何处,编译器总会将变量声明优化前置。但为了程序的可维护性,最好还是按照java、C++等语言的严谨写法书写代码。
局部变量虽可随处声明,但注意其赋值的有效性,如:
trace("循环外:" + str);
for(var i:int =1; i<=3; i++)
{
 var str:String = "你好,正在循环";
 trace(i + ":循环内:" + str);
}
/-----
循环外:null
1:循环内:你好,正在循环
2:循环内:你好,正在循环
3:循环内:你好,正在循环

程序在变量未赋值前就使用此变量,虽可编译运行,但最终打印出str的值为null。

四:函数表达式
这一点很像js的匿名函数,可以说完全相同。
var func:Function = function(par:int){
 return par*8;
}
trace(func(8));
/-------
64

声明了类型为Function名为func的变量,此变量的值很怪异,看上去完全是个函数,其实函数本身也是对象,把对象赋值给变量有什么不对呢?虽然java有匿名类、C#也引入了匿名函数,但它们因为的实现方式肯定没有js与as3直观和简洁。匿名函数是由变量记录这个无名函数的内存地址,而外部访问是由变量作为介质的,因此删除变量,等于删除了这个无名函数。但值得注意的是,函数表达式本身的书写方式导致不宜维护,因此如果没有特别需要毋须将函数写为匿名函数。

五:arguments
AS3函数使用中,可以给函数传入一系列的参数,如:
function sub(par1:int,par2:int)
{
.....
}
在这之中,当参数传入函数调用之后,AS3编译器会生成一个名为arguments数组对象,它保存了当前函数传入的参数的值,可以看作参入参数的备份。
function sub(par1:int,par2:int)
{
 par1 = 3;
 par2 = 4;
 var sub1:int = par1 + par2;
 var sub2:int = arguments[0] + arguments[1];
 trace("函数参数之和:" + sub1);
 trace("arguments之和:" + sub2);
}
sub(1,2);
/--------
函数参数之和:7
arguments之和:3

但这个备份数组仅限于参数是按值传递的情况下,如参数是以引用传递则arguments的值会跟着改变。
function sub(par:Array)
{
 par[0] = "jack";
 trace("函数参数:" + par);
 trace("arguments:" + arguments);
}
var arr:Array = new Array(1,2,3);
sub(arr);
/--------
函数参数:jack,2,3
arguments:jack,2,3

另外,arguments有个重要属性:callee,就是call自己。如使用该属性,程序会将arguments所在的当前函数按照callee的赋值再次执行一次
var bool:Boolean = true;
function sub(par:Array)
{
 par[0] = "jack";
 trace("函数参数:" + par);
 trace("arguments:" + arguments);
 if(bool)
 {
  bool = false;
  var arrbak:Array = new Array("开始执行callee",1,1);
  trace("开始执行callee");
  arguments.callee(arrbak);
 }
}
var arr:Array = new Array(1,2,3);
sub(arr);
/--------
函数参数:jack,2,3
arguments:jack,2,3
开始执行callee
函数参数:jack,1,1
arguments:jack,1,1

六、重载

一种OOP语言拥有重载特性是很习以为常的事,毕竟任何OOP语言都必须遵循OOP三大特质。有意思的是AS中,重载这样在其他语言司空见惯的特性,在AS3出现以前都是不存在的(不仅AS,javascript、vbScript、ruby等常见脚本语言都不支持,到底是脚本啊 .... ),且AS3的重载说到底也是模拟重载,一种数组变通而已。

1:使用aruments的length属性进行重载

function test(par1:int):void
{
 if(arguments.length == 1)
  trace("重载1");
 else if(arguments.length >1)
  trace("重载2");
 else
  trace("重载3");
}
test(1);
test(1,2);
test(1,2,3);

/--------------------

重载1
重载2
重载2

注意函数test在声明时只声明了 par1:int 一个参数,而在调用时程序连续调用了3次test,并且后两次参数与函数声明不符,多了。但编译器如果运行在标准模式下编译,是不会报错也可以运行的,这样arguments数组会扩大为你传进来参数的个数,如test(1,2,3),arguments长度就是3了,程序中如果需要用到2、3,只能通过arguments[1]/[2]来找到多出的参数。用arguments时,注意编译器一定要运行在标准模式下;参数只能比函数声明多,不能少。

2:使用 ...(args) 来传入不同参数。

注意:...(args) ,前面是3点,英文模式下的3点,不多不少。args是传进来参数数组的名称,可以任意。

function test(...args):void
{
 if(args.length == 1)
  trace("重载1");
 else if(args.length >1)
  trace("重载2");
 else
  trace("重载3");
}
test(1);
test(1,2);
test(1,2,3);

/--------------------

重载1
重载2
重载2

当使用...args ,在程序中就不能用arguments来获取参数了,取而代之是args。...args 也可以与声明参数一起使用

function test(par1:int,...args):void
{
 if(args.length == 1)
  trace("参数" + par1 + "  重载1  args参数:" + args);
 else if(args.length == 2)
  trace("参数" + par1 + "  重载2  args参数:" + args);
 else
  trace("参数" + par1 + "  重载3  args参数:" + args);
}
test(1,1);
test(1,2,3);
test(1,2,3,4,5);

/---------------------

参数1  重载1  args参数:1
参数1  重载2  args参数:2,3
参数1  重载3  args参数:2,3,4,5

这样也变通模拟了函数重载,args是不需要编译器标准的无论在严谨或标准模式都可运行;args使用后arguments不能使用包括其属性;在给已声明参数赋值后,接下来无论多少个参数编译器都会将其作为数组传给args。

转载于:https://www.cnblogs.com/sun11086/archive/2009/12/05/1617385.html

[转]AS3 与 其他语言 的一些不同点相关推荐

  1. Flash入门对AS语言的一些理解

    以下是我学习Flash一周以来对AS代码的一些理解,编码击规范的一些看法和对MVC框架的理解,学习过程中的一些笔记,很多地方都只是个人之见 第一部分:对AS的理解: 关于语法: 由于AS3是基于ECM ...

  2. (新手入门)AS3基于starling引擎移动开发之入门介绍

    从本期开始,我将陆续推出关于Actionscript3.0的移动开发入门知识,旨在帮助没有AS3开发经验而想从事或了解AS3移动开发的朋友,所以我的这一系列教程将是入门教程,欢迎各路大神.大牛多指教, ...

  3. C++之python和Lua脚本语言

    文章目录 Python Lua C++ 高效.灵活,但开发周期长.成本高,在混合系统里可以辅助其他语言,编写各种底层模块提供扩展功能,从而扬长避短: pybind11 是一个优秀的 C++/Pytho ...

  4. Scala入门之函数编程

    2019独角兽企业重金招聘Python工程师标准>>> 虽然Twiiter提供了中文版Scala教程:Scala 课堂,但是这只是一个参考书,并不适合Scala初学者,Scala与J ...

  5. ActionScript 3.0 概要

    翻译:衡-----------蓝色理想--经典论坛 --- 类型:转载 ActionScript 3.0 演变成一门强大的面向对象的编程语言意味着flash平台的重大变革.这种变化也意味着 Actio ...

  6. 编写可靠 bash 脚本的一些技巧

    作者:astarsun,腾讯搜索工程师 写过很多 bash 脚本的人都知道,bash 的坑不是一般的多.其实 bash 本身并不是一个很严谨的语言,但是很多时候也不得不用.以下总结了一些编写可靠的 b ...

  7. 编写可靠bash脚本的一些技巧

    编写可靠bash脚本的一些技巧 原作者:腾讯技术工程 原文链接:https://zhuanlan.zhihu.com/p/123989641 写过很多 bash 脚本的人都知道,bash 的坑不是一般 ...

  8. 免费易混实词辨析456组(1)

    莫红日 A 1    [哀怜•爱怜•爱恋]三者读音大致相同,但意义和用法不同."哀怜"指对别人的不幸遭遇表示同情,如"中华民族有哀怜弱者的传统"."爱 ...

  9. 2019年的最新的最全的ava常见的面试题

    1.抽象类和接口的区别(三张思维导图教您更高效学习SSM框架) 抽象类可以有构造方法,接口中不能有构造方法. 抽象类中可以有普通成员变量,接口中没有普通成员变量. 抽象类中可以包含非抽象普通方法,接口 ...

最新文章

  1. ISME | 通过长读长宏基因组测序揭示南极土壤未培养细菌的生物合成潜力
  2. 太阳系八大行星碰撞的视频_高中地理——太阳系与地球
  3. 使用VirtualBox SDK之初步编译
  4. 创业动力衰减 中国面临危险挑战
  5. Flutter修仙传第二章:路由详解
  6. Maven: git-commit-id-plugin插件
  7. 两本关于sharepoint 2010的书值得参考
  8. 哎呦,我他妈真操了!
  9. Matlab 2016a 安装包及破解教程
  10. Microsoft Visual Studio .NET 2003 编译xvidcore-1.1.3
  11. 数据库SQL语句练习一
  12. 中职计算机说课稿三篇,中职计算机说课稿三篇.docx
  13. 软件著作权申请需要哪些材料?
  14. tk免费顶级域名注册及使用
  15. c语言中余数恒等于1,恒等于符号怎么打就是“≡”符号在windows里怎么打出来具体到搜狗里怎么打,麻烦说细点儿...
  16. layui layer btn
  17. 阿波罗登月计算机技术,你知道吗,阿波罗登月用的计算机还不如你家计算器!...
  18. linux系统盘ssd,Linux系统下如何使用SSD固态硬盘
  19. ODL Netconf 连接器 + Netopeer
  20. [MakeFile教程-09] 隐含规则

热门文章

  1. 一文了解Kubernetes的前世今生
  2. Navicat工具、pymysql模块
  3. 掘金健康大数据 需突破多重挑战
  4. Android启动过程深入解析【转】
  5. scrapy笔记——python的时间转换
  6. swift 学习笔记之在柯里化(Currying)
  7. Tensorflow 处理libsvm格式数据生成TFRecord (parse libsvm data to TFRecord)
  8. display vs visibility
  9. 那些年,我在西安的“遇见”(一)
  10. 站立会议报告(12)