主题:  [原创]ActionScript词法结构完全掌握

lewiworkshop

职务:普通成员
等级:1
金币:8.0
发贴:7
注册:2004/8/8 19:14:42
#12004/11/28 11:55:31
教程文件

Flash 动画

提供PDF格式收藏

相关文件:点这儿打开


内容预览
Flash词法结构完全掌握
Lewi(刘艺)
版权声明:本文中的内容,未经许可,不得以任何手段和形式进行复制、抄袭、再造文中的内容!如需转载请注明。
写在前面前言

本教程所要讨论的内容包括Flash词法结构的所有知识,在接下来的内容中我们将接触点、空白、语句终结符、注释、保留字、标识符等知识点。最后我们会全面了解Flash词法结构的所有内容。

本教程不是为WEB开发者或者大网络公司创作部门的成员所准备的,它属于ActionScript程序员所必需掌握的基础知识,如果你是初级学者那么这本教程能够很好的指导你看懂Flash ActionScript的基本语法结构。本教程中并没有包含诸如对象、类、服务器通信以及XML、组建等高级主题,如果你需要更高等的信息可以阅读更多关于我的教程。

本教程设计的目的是本教程所介绍的知识实实在在,能够被你立即应用,而不是纯粹的理论而束之高阁,你再学习完本教程后尝试阅读ActionScript代码,看看你前进了多远。

如何更好的使用本教程
你在阅读本教程的时候并不需要专业的编成知识,即便是你对ActionScipt一无所知。你需要的是学习的热情,只要你认真地通读你会学到知识的,相信我!如果愿意接受来自我更多的激情,请关注我(lewi)的更多教程。

建议与评论
尽管我做了最大的努力保证我们的课程都基于专业产品——正确、充实、丰富、直观,但错误、疏忽和个人水平的不足是难说避免的,如果你发现有什么错误或者对此教程有什么看法和建议请通过下面的方式告诉我:
我的成长需要你的关注!
QQ:15873393 // 谢绝聊天…^_^…
Email:lewi_workshop@163.com lewiworkshop@sina.com lewiworkshop@sohu.com

最后你可以通过快速回复主题来提交你的看法或者建议


词法结构
空白
我请你先记住一个抽象的定义:空白是指代码行中用不同方式插入的空白集合。不要晕,我说过它很抽象,我会把它讲的很通俗,空格包括空格键插入的空格、Tab键插入的缩进、以及回车(也就是分行)。它在ActionScript中的作用就像英语中的空白一样,如:Come on要是没有e和o之间的空白就成了comeon这样一个错误的单词了,也许我们可以猜出要表达的是Come on但是我们要知道ActionScript的词汇量是很有限的,而且不擅长于设想,也就是说空白对于程序员来说是很重要的,它直接关系着程序的可执行性。

varx // 在关键字var和变量x之间没有空白所以是错误的。

var x // 在关键var和变量x之间有了空格,这下就好了,解释程序能够读懂代码了。

在表达式中如果有其他的分隔符能够告知ActionScript在什么地方中断,又从什么地方开始Flash将ActionScript代码编写到Flash影片中时,代码中的空白区域通常不会产生任何错误。
我们看下面的代码:
下面的操作符=、-号、*号将x、2、1、和y分开了

x=2-1*y; // 看起来超级拥挤,但还是可以的到解释程序的编译

x = 2 - 1 * y // 这样既好看又好读懂,但同样是正确的

不关是在上述操作符中,空白在诸如:方括号、花括号、逗号、大于、小于等其他符号中同样是可有可无的,我们在看看下面的代码:

if(x==1){y=[a,b,c,d,e];} // 看起来真的不舒服,挤死啦!

on (release) { getURL("lewi.html");} // 有点不好看,可是正确的

// 又标准,又好看,又正确!
on (release) {    
    getURL("lewi.html");
}

// 这么难看,但又是正确的代码真是少见,下次可不要在这么写!
on ( release) {getURL("lewi.html");}

// 这是什么啊?哦,原来是上面要表达的x = 2 - 1 * y,还真是不好看懂。。。
x=
2
-
1
*y

// 我们再来看一个分行符的例子,分行符多数没有意义,主要是让代码更易懂。
myMenuArray = [[News,Down,BBS],
[新闻,资源,论坛],
["News.asp","Soft.asp","Bbs.asp"];

// 比下面的要整洁的多
myMenuArray = [[News,Down,BBS],[新闻,资源,论坛],["News.asp","Soft.asp","Bbs.asp"];

// 也比这样要整洁
myMenuArray = [[News,Down,BBS],
[新闻,资源,论坛],
["News.asp","Soft.asp","Bbs.asp"];

看了这么多的例子,我们知道了空白的诸多好处,但在使用空白的时还候必须要注意:
1.    如果空白将一个动作中的关键术语分开时会产生错误,看下面的例子
// 在t和U之间存在空格,破坏了关键术语,解释程序就没法编译,所以是错的。
on (release) {    
    get URL("lewi.html");
}

2.    用来划分串界限的引号内的空白和引号外被忽略的空白是不同的,看下面的的例子

var x = "lewi";
trace("I love"+ x); // 显示I lovelewi
trace("I love "+x); // 显示I love lewi


我们知道Flash的主工程师Gary Grossman在设计Flash5 AcrionScript并没有白手起家的设计一门新的语言,而是在最大程度上模仿javascript的EMCA-262规范,javascript是Internet上客户端脚本的标准,因此Flash ActionScript使用圆点语法,这意味着圆点语法的所有动作都使用通常面向对象编程(OOP)语言,使用的标准格式编写:
对象.属性=数值 或 对象.方法();
我这样说你也许会感到昏,我会把他讲的更加易懂些,你继续读
ActionScript中点(.)被用来指明某个对象或电影剪辑的相关属性方法,点是我们指向对象和嵌套影片剪辑的主要工具,他可以让我们设置和获取对象属性。我举几个例子给你,

ballMC._alpha // 是指影片剪辑的透明度值

ballMC._visible // 指示影片剪辑ballMC是否可见

ballMC._x; // 是指影片剪辑实例ballMC在X轴(_X)属性

ballMC.play(); // 在影片剪辑的时间轴中移动播放头

ballMC.stop(); // 停止当前正在播放的影片剪辑

从上面五个表达式中,我们很轻易的就能发现点语法表达式由对象或是影片剪辑开始,紧接着就是个小点。点出了上述的被用来指明于某个影片剪辑相关的属性和方法,它还用于标识指向影片剪辑或变量目标路径,我同样通过几个例子来说明:
Submit是在影片剪辑form中设置的一个变量,而form又嵌套在在影片剪辑shoppingCart中,图一能够明确的表示这种包含关系。

表达式:shoppingCart.form.submit=true的作用就是设置实例form的submit变量值为true

再如我要与metagalaxy中earth下human的lewi通信,
表达式就应该这么写:metagalaxy.earth.human.lewi
我们可以看图二中影片剪辑的包含关系。

点语法还有两个特殊的别名_root和_parent。_root是指主时间线,可以使用_root别名创建一个绝对路径,_parent创建一个目标路径。我通过例子来说明:

表达式_root.ballMC意为在主时间线(_root上一个名为ballMC影片剪辑实例的绝对路径)

这里我们应当注意表达式中的句点(就是点)将术语_root与ballMC分开,点在这里表示一种父子关系,即在实例中_root与ballMC为父子关系。

我们再看下面的表达式:

// 这个例子被嵌套在ballMC影片剪辑中的circleMC影片剪辑实例具有绝对路径。
_root.balllMC.circleMC

Flash允许我们用别名_parent来引用嵌套当前电影剪辑的电影剪辑。也可以用_parent来创建一个相对目标路径如:
如果circleMC被嵌套在影片剪辑ballMC中那么在影片剪辑实例circleMC上告诉ballMC停止播放

表达式就应该这么写:_parent.stop();

需要了解有关于路径方面的更多知识可以关注我的《关于目标路径和绝对路径》一文

分号
你应该注意到,大多数动作代码的行尾都有一个分号(;)用来终止一个ActionScript语句,但在ActionScript中没有分号,解释程序仍会在没有使用分号的时候判断语句的结尾,进行编译,但这并不意味着我鼓励你省略分号!我们看

// 这些写的很标准
var x = 1;
var y = 2;

// 虽然没有分号,但是我是合法的,解释程序能够读懂的
var x = 1
var y = 2

我们省略了分号解释程序同样能读懂,但是总会有导致解释程序误解的情况,就如我们在抒写文章的过程中忘记了写句号一样。
我们看下面的例子:

function addone(value) {
    return
    value+1
}

我们选择程序写入面板上的格式化按钮,系统会把我们的代码格式为

function addone(value) {
    return;
    value+1;
}

说明什么?说明函数就不会返回value+1,而通常是返回undefined,关键字return单独存在也是一个合法的语句。要避免这种含混的情况,我们就要合理的使用分号,此外在return语句的特定情况下,不要将关键字return和其他的表达式用分行符分开(前面你学过分行符的)。
上面的语句应该这么写:

function addone(value) {
    return value+1;
}

注意:分号用来终结单独的语句时,在语句块结束的时候却不需要:

for (var i = 0; i<10; i++) { // 这里不需要分号
    trace(i); // 这里要分号
} // 这里也不需要分号

注意:函数产量后面必须有分号

function (param1, param2, param3, ...paramn) {statements};

注意:在使用#include动作时,不要再#include语句的最后加上分号。
#include动作可以看成FlashMX的特殊标记,他提示Flash把这个#include语句替换为提到的文件中的全部内容。我们看下面的代码:

// 由于用了分号结尾,所以会出现一个malformed错误
#include "contact.as";


大小括号
大括号,大括号的用法比较简单,常用于以on开始的动作如on()和onClipEvent()以及if和function声明。看这个例子

on (release) {
    getURL("mypage.html");
    // 用了大括号分块
}

小括号,使用小括号的地方特别的多,但并不是全部动作在动作名之后都需要小括号,诸如:on()、getURL()、play()等。
当我们定义一个函数时,需要把参数放在小括号中:

function myFunction(age, mame) {
    ...
// 要记住啊,参数放在小括号中!
}

调用一个函数时,也要把传递参数放在原括号中:

myfunction("18", "lewi");

这里我给你总结了两条使用规则
1.    如果一个动作需要参数,那么就会需要括号(很多诸如stop();等不需要参数也要括号)
2.    所有开括号(()都需要闭括号())。

小括号还可以改变运算优先级如:

trace (6 + 8 / 2 ); // 输出10
trace ( (6 + 8 ) /2 ); // 输出7

注释
在Flash中注释会被解释程序忽略,程序员在抒写代码时为了增加代码的易读性而故意输入的文本成为注释,注释是概念上的代码描述,他反映了不了代码本身的语法。注释经常用来解释代码所要完成的工作,提供版全、版本信息或者其他描述信息等。

i = 1;
// 将i设置为5

我们在看下面的注释,下面的注释比上面的注释更清晰,可以帮助我们跟随代码的流程

var i = 5;
// 初始化计数,用来搜索从5开始的数字

注释支持单行注释和多行注释。单行注释你已经接触过了,是以两个斜杠(//)开始的:

// 嗯,我写我写……我写的详详细细的,反正解释程序不会读到我…^_^…

单行注释在被分行符分开后,注释就结束了,我们要创建多行注释必须使用更多的//符号:

// 嗯,我还想写点什么,继续,继续……
// 这里我再补充一些,嗯,我还聪明,每次换行要在前面加上//符号,这才是认可的注释

注释还可以写在代码的后面前面你看到过的

trace (6 + 8 / 2 ); // 输出10(这个注释在代码的后面,是认可的!)

哇,你可能要想我要写个几十行注释岂不是打//符号都要打半天,不用担心我会告诉你一个多行注释的方法,这种多行注释用来适应大块代码说明,如版本信息等,他不会被换行符打断,多行注释以/*开始以*/结束,看下面的

/*^^^^^^^^^^^^^^开始版本信息^^^^^^^^^^^^^^^^
名称:flash计算器 版本:1.01
作者:lewi 联系方式:119313796
最后更新日期:2004年11月28日星期日
^^^^^^^^^^^^^^^^版本信息结束^^^^^^^^^^^^^^*/

当然把注释写在前面也可以,就是不好看,但他合法

/* 输出10(这个注释代码写在前面,是认可的!)*/ trace (6 + 8 / 2 );

还有注释也是可以嵌套的:

/*这个是一个嵌套的// 注释,很好玩吧?*/

注释的用法还有一个秘密,这里我告诉你,我们可以通过注释让代码临时失效,或者永远的失效。只要删除注释符号就可以让代码恢复效果?:

/* 啊哈代码失效了!
if (depth<200) {
    gotoAndPlay("generate");
}
直到我改变主意,删除注释符号*/

大小写区分
ActionScript语言AS1.0中的变量名不区分大小写,但不能以数字开头AS2.0要区分大小写。当一门语言全部都要区分大小写的时候,语言中的所有符号都不需以正确的大小写形式书写,否则就会出现错误。如:

// 下面的语句在AS2.0中声明了两个不同的变量,但在AS1.0是同一个变量。
var name = "lewi";
var Name = "lewiworkshop";

ActionScrip1.0基于ECMA-262 兼容标准,变量名不区分大小写,但关键字(我一会儿会给你讲)都是区分大小写的,。我还好举个例子来说明

gotoandPlay(2); // 应该是gotoAndPlay(2);

在AS1.0中标识符不区分大小写,我们看下面的语句
var myName = "lewi";
var myname = "lewiworkshop";
trace(myName); // 产生lewiworkshop
trace(myname); // 也产生lewiworkshop

在AS2.0种就不然了:
var myName = "lewi";
var myname = "lewiworkshop";
trace(myName); // 产生lewi
trace(myname); // 产生lewiworkshop

所有的情况关键字必须一致,就算是语言中不严格要求一致性的时候,也要养成一致性的好习惯,还有就是保持不变的变量、函数、实例等其他项目的大小写风格会让你的代码变得很容易理解,很好读。
保留字
ActionScript的解释程序保留了一些特殊的字符,用这些字符内置语言功能如:var变量声明,这些保留字是给解释程序用的,我们在使用的过程中必须避免他们作为标识符。ActionScript的保留字在很多参考书籍中都有,这里我就不再一一列出来了

标识符
在flash中所有的变量、函数和对象属性都用标识符来命名,下面给出了构成规则
1.    标识符只能包含字母、数字、下划线和$符号。不可以有空格、句点、反斜杠等
2.    表示服必须以字母、下划线或者$符号开头。
3.    标识符不能和保留字相同。
我还建议你在影片剪辑实例名称、标签、层名、场景名称命名的时候也遵循上面的规则

编辑历史:[此帖最近一次被 lewiworkshop 编辑过(编辑时间:2004-11-29 12:37:59)]


lewiworkshop

职务:普通成员
等级:1
金币:8.0
发贴:7
注册:2004/8/8 19:14:42
#22004/11/29 12:38:49
请你们通过我打包的PDF或者SWF文件进行学习
这里的内容预览失去了预制的版式效果。



bookondesk

职务:普通成员
等级:1
金币:0.0
发贴:55
注册:2003/7/26 15:55:43
#32004/12/5 21:11:59
不错1谢谢



xxl1014

职务:普通成员
等级:1
金币:0.0
发贴:32
注册:2004/12/6 18:39:31
#42004/12/10 16:31:38
就这些吗?有没多一点呀!谢谢了!



xxl1014

职务:普通成员
等级:1
金币:0.0
发贴:32
注册:2004/12/6 18:39:31
#52004/12/10 16:45:02
关键字return单独存在也是一个合法的语句,,
这是什么意思?就到这,,后面的语句就不执行了吗?



xxl1014

职务:普通成员
等级:1
金币:0.0
发贴:32
注册:2004/12/6 18:39:31
#62004/12/10 16:58:20
小括号,使用小括号的地方特别的多,但并不是全部动作在动作名之后都需要小括号,诸如:on()、getURL()、play()等。
我怎么看不懂,,那些才不用,,小括号()呢?



xxl1014

职务:普通成员
等级:1
金币:0.0
发贴:32
注册:2004/12/6 18:39:31
#72004/12/10 17:16:18
保留字是什么呢,,,对不起,,我才第一次学这,,看这脚本语言



大梦未醒

职务:普通成员
等级:5
金币:9.0
发贴:3310
注册:2004/1/15 17:35:00
#82004/12/14 16:52:29
谢谢先.



bookondesk

职务:普通成员
等级:1
金币:0.0
发贴:55
注册:2003/7/26 15:55:43
#92004/12/19 20:12:54
很好!支持



hanbright2004

职务:普通成员
等级:1
金币:0.0
发贴:16
注册:2004/3/6 10:54:05
#102005/2/3 23:52:06
支持!!!!!!!!!!!!!!!