ActionScript是 Macromedia(现已被Adobe收购)为其Flash产品开发的 ,最初是一种简单的脚本语言,现在最新版本3.0,是一种完全的面向对象的编程语言,功能强大,类库丰富,语法类似JavaScript,多用于Flash互动性、娱乐性、实用性开发,网页制作和RIA应用程序开发。
ActionScript 是一种基于ECMAScript的脚本语言,可用于编写Adobe Flash动画和应用程序。 由于ActionScript和JavaScript都是基于ECMAScript语法的,理论上它们互相可以很流畅地从一种语言翻译到另一种。不过JavaScript的文档对象模型(DOM)是以浏览器窗口,文档和表单为主的,ActionScript的文档对象模型(DOM)则以SWF格式动画为主,可包括动画,音频,文字和事件处理。
ActionScript第一次以它目前的语法出现是Flash 5版本,这也是第一个完全可对Flash编程的版本。这个版本被命名为ActionScript1.0。Flash 6通过增加大量的内置函数和对动画元素更好的编程控制更进一步增强了编程环境的功能。Flash 7(MX 2004)引进了ActionScript2.0,它增加了强类型(strong typing)和面向对象特征,如显式类声明, 继承,接口和严格数据类型。ActionScript1.0和2.0使用相同的编译形式编译成Flash SWF文件(即Shockwave Flash files,或 'Small Web Format').
时间表
Flash Player 2:第一个支持脚本的版本,包括控制时间轴的gotoAndPlay, gotoAndStop, nextFrame和nextScene等动作。
Flash Player 3:增强了载入外部SWF文件的基本脚本支持(loadMovie)。
Flash Player 4:第一个完全实现脚本功能(称为动作)的播放器。这些脚本拥有简练的语法和对循环,条件,变量和其它基本语言结构的支持。
Flash Player 5:第一个拥有真正意义上的ActionScript的版本。依据ECMAScript并采用基于原型编程,并允许完全的 过程式编程和面向对象编程。
Flash Player 6:增加了事件处理模型,并且支持switch。
Flash Player 7: Flash Player 7 提供一些新特性如支持CSS显示文本和增强显示效果。 Macromedia Flash编译器和Flash Player 7同时支持基于ECMAScript 4 Netscape Proposal的类编程语言ActionScript 2.0。不过ActionScript 2.0能交叉编译成ActionScript 1.0的字节码,因此它能运行于Flash Player 6。
Flash Player 8:增加用于运行时图象数据控制和文件上传的新类库及APIs,ActionScript 2.0功能更为完善。
Flash Player 8.5(计划于2006春发布release版本,currently in public beta):增加ActionScript 3.0和一个称为AVM2(ActionScript Virtual Machine 2)新的虚拟机,它可以与前版本AVM1共存以便支持旧内容。增强性能是该版本的主要目标。
Flash Player 9 2007发表,这是adobe收购Macromedia后的第一个版本,并且也是Mac OS X上第一个Universal版本的Flash Player。
Flash Player 10
语法
在ActionScript 2.0 类、与函式馆物件(如影片片段)可与类联系在一起。类总写在外在文件档案内,并且这些文件必须有.as后缀。类是增设部分──对ActionScrip语言来说,可让程式员自行开发,虽然有许多内建类譬如MovieClip类──可被用来动态地在屏幕上画出向量──已经满足需求了。类档案可用来使您编程更加容易,并且类档案如果需要的话可在许多专案间转移。
Flash ActionScript实现的特点如下,JavaScript程式员也许感兴趣:
一切设计是异步的;callback是普遍存在的,但事件对象不存在。
XML的实现从Flash 5便存在了。Flash可送和收XML,该项功能可用来透过网络服务器创造网上多玩者游戏。
ActionScript 代码常常直接写在Flash开发环境。该环境提供参考、代码提示和句法强调。原代码常常与电影一起存在.fla档案里。自外部文件档透过#include语法导入ActionScript代码也相当常见。在这种情况下,外部档案也许被Flash集成开发环境内建编译器,或Motion Twin ActionScript2编译器(MTASC)编译。参见外部链接。
评论
编程人员们说Macromedia ActionScript 2.0编译器有点慢,常常花好几分钟才编译100个类别,然而开放源码编译器MTASC可以利用;它快多了。
ActionScript非常宽大的语法常常让编程人员们皱眉,因为它常常让不干净代码难以阅读。
在Flash里使用许多向量图形可能拖慢执行许多应用程序的机器的效能,因为Flash每帧每帧重画每个向量图。Flash 8引进了cacheAsBitmap 变量,它暂时把向量图转换到位图,这种做法帮助降低了延滞。
Flash的ActionScript VM倾向在触发内部的暂停处理前就非常快达到它的运算极限,特别在麦金塔版的Flash播放器上更严重。例如,简单从1算到5000会威胁某些用户Flash播放器的能力。
在Flash 8里许多人不喜欢引入(import)某些类直到要用到那些类别前最后一刻。不幸的是,ActionScript 3.0相当倚赖引入类别,没有导入撰写脚本(scripting)实际上不太可能。
.swf档案格式挺容易反编译,使它非常难以保持源代码机密。
ActionScript 2.0 样本
下面打印Hello World。值得注意的是这只能在整合环境下执行,因为trace函式只有支援整合环境。
trace("Hello world!");
下面代码利用onMouseMove事件当鼠标移动时输出现行鼠标位置。同样的这只有在整合环境下执行。
onMouseMove = function () {
trace("X: "+_root._xmouse);
trace("Y: "+_root._ymouse);
};
这个较先进的范例创造一个包括数字与字串的阵列,并利用原形函式(prototype function)与函式递归给变量名num指定一个数,给变量str指定一个字串。然后,利用MovieClip应用程序接口,文字区域被显示在屏幕上,文字区域里头写入了变量值。
var my_Array:Array = new Array("Hello", "ActionScript", 3, 7, 11, "Flash");
Array.prototype.pickNumber = function():Number {
var rand:Number = random(this.length);
return (typeof (this[rand]) == "number") ? this[rand] : this.pickNumber();
};
Array.prototype.pickString = function():String {
var rand:Number = random(this.length);
return (typeof (this[rand]) == "string") ? this[rand] : this.pickString();
};
var num:Number = my_Array.pickNumber();
var str:String = my_Array.pickString();
_root.createTextField("txt", 1, 10, 10, 530, 390);
txt.text = "Array = "+my_Array+"\nRandom Number = "+num+"\nRandom String = "+str;
ActionScript 3.0 样本
下面先进的Hello World程序目前需要在Flex 2.0公开Alpha测试版整合环境中编译。
package {
import flash.text.TextField;
import flash.display.MovieClip;
import flash.filters.DropShadowFilter;
public class HelloWorld extends MovieClip {
public function HelloWorld() {
var shad:DropShadowFilter = new DropShadowFilter(2, 45, 0x000000, 25, 3, 3, 2, 2);
var txt:TextField = new TextField();
txt.textColor = 0xFFFFFF;
txt.filters = [shad];
txt.width = 120;
txt.x = Math.random()*300;
txt.y = Math.random()*300;
txt.selectable = false;
txt.text = "Hello World! ["+Math.round(txt.x)+","+Math.round(txt.y)+"]";
addChild(txt);
}
}
}
//-----ActionScript3.0----------------- //as3.0最重要的概念就是在效能方面的增进,平时所加入的任何事件都可以被监听或从内存中移除 //以下例子就是监听与移除内存占用,这是as3.0最重要的基础概念
bt1.addEventListener(MouseEvent.CLICK,bt1_click);
function bt1_click(e:MouseEvent):void{ //触发的事件内容; }
//该按纽监听不需要时则remove掉,增加效能 bt1.removeEventListener(MouseEvent.CLICK,bt1_click);
本文链接
jauery.jtime 配置项
参数默认值描述datenew Date()起始时间looptrue是否变动ontime$.noop当时间变动时执行的函数format"yyyy-MM-dd HH:mm:ss \u661F\u671FW"日期格式
1 /**
2 * 时间对象的格式化
3 */
4 Date.prototype.format = function(format){
5 var y=this.getFullYear(),
6 M=this.getMonth(),
7 d=this.getDate(),
8 h=this.getHours(),
9 m=this.getMinutes(),
10 s=this.getSeconds(),
11 ms=this.getMilliseconds(),
12 z= this.getTimezoneOffset(),
13 wd=this.getDay(),
14 me=new Date(y,M,0).getDate(),
15 w=["\u65E5","\u4E00","\u4E8C","\u4E09","\u56DB","\u4E94","\u516D"];
16 var h12=h>12?h-12:h;
17 var o = {
18 "y+" : y, //年份
19 "M+" : M+1, //月份
20 "d+" : d, //月份中的天数
21 "H+" : h, //小时24H制
22 "h+" : h12==0?12:h12, //小时12H制
23 "m+" : m, //分钟
24 "s+" : s, //秒
25 "ms" : ms, //毫秒
26 "a+" : h>12||h==0?"PM":"AM", //AM/PM 标记
27 "w+" : wd, //星期 数字格式
28 "W+" : w[wd], //星期 中文格式
29 "q+" : Math.floor((m+3)/3), //一月中的第几周
30 "e+" : me, //月份中的最大天数,如1月有31天,返回31
31 "z+" : z //时区
32 }
33 if (/(y+)/.test(format))
34 format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4- RegExp.$1.length));
35 for (var i in o)
36 if (new RegExp("(" + i + ")").test(format))
37 format = format.replace(RegExp.$1, RegExp.$1.length == 1? o[i]: ("00" + o[i]).substr(("" + o[i]).length));
38 return format;
39 };
40
41 /**
42 * jtime for jQuery 显示时间插件
43 * 功能:以不同的形式显示时间
44 * @author 马德成
45 * @version 1.0
46 * @date 2013-01-10
47 * @email xiaosefengqi@163.com
48 * @qq 310851010
49 * @param options 插件配置
50 */
51 $.fn.jtime=function(options){
52 var thisV=$(this);
53 var defaults={
54 date:new Date(), //起始时间
55 loop:true, //是否循环
56 ontime:$.noop, //当时间变动时执行的函数
57 format:"yyyy-MM-dd HH:mm:ss \u661F\u671FW" //日期格式
58 }
59 var options = $.extend(defaults, options);
60 options.date=(typeof options.date=="string")? new Date(Date.parse(options.date)):new Date(options.date);
61 options.format=(typeof options.format=="undefined")||($.trim(options.format)=="")||
近日,Oracle的多语言领导Jim Laskey提议将一个新的基于JVM的JavaScript实现Nashorn作为OpenJDK项目。Nashorn是Rhino的后继,而 Rhino则是目前的JVM JavaScript实现,它起始于1997年的Netscape,并且经过一些细微的修改后随2006年12月的Java SE 6一同发布。Nashorn则计划随Java 8一同发布并作为其一部分而存在。
Laskey在其OpenJDK的项目提案中说到“Nashorn的目标是在原生JVM上提供一个轻量级、高性能的JavaScript”:
该项目的范围包括但不限于一个解析器API(扫描JavaScript源代码)、一个编译器(将解析器中的抽象语法树AST转换为JVM字节码)及一个运 行时(支持上述生成的字节码的执行)。该环境中JavaScript的执行将与ECMA-262 5.1一致,并且会随着标准的不断演进而适应于新的指南。虽然使用了与Rhino相关的名字,但Nashorn(德语的rhinoceros)却是个全新的代码基,充分利用了Java 7的InvokeDynamic字节码指令。其实现要比Rhino小且快,这使得它更加适合于运行在嵌入式/移动设备上;比如说,它既能运行在Beagle Board上,也能运行在Raspberry Pi上。
Laskey在去年9月的JavaOne上说到,团队正在研究其他JavaScript实现的性能,因此其性能应该能与现代浏览器一较高下。此外,Twitter的Sam Pullara还介绍了他是如何使用Nashorn来渲染Mustache.js模板的。
一切都正常,我根本没有遇到过Nashorn的正确性问题。在性能方面,对于大多数颇具挑战的测试,Nashorn要比Rhino快20多倍。此外,NetBeans团队已经在Nashorn基础之上完全重写了其JavaScript实现。对于有大量JavaScript文件需要扫描的项目来说,变化的结果就是IDE启动时间的大幅降低。
除了与Rhino相比性能上的提升外,Nashorn相对于其他JavaScript实现来说的一个优势在于它可以访问众多的Java库,包括客户端的JavaFX及服务端的JSP。为了支持这种交互,Nashorn使用了Dynalink—— 基于Apache许可的开源元对象协议,构建在InvokeDynamic之上,由Attila Szegedi开发,他从Twitter加入了Oracle。Dynalink提供了一套约定以在程序执行环境中指定更高层次的对象操作,对于普通的 Java对象它提供了一个链接器。
现在Nashorn提案已经有了一个专门的博客。当Nashorn能够100%兼容于ECMA-262时,OpenJDK项目的工作将会专注在性能以及通用性上。潜在的OpenJDK合作者包括Twitter、IBM与Red Hat。
本文链接