asp学习网: 首页 >> 杂项 >> wap网站建设 >> WML Script1.1简介

WML Script1.1简介

WML Script是属于无限应用协议WAP应用层的一部分,使用它可以向WML卡片组和卡片中添加客户端的处理逻辑,目前最新的版本是1.1版。WML Script1.1是在欧洲计算机制造商协议会制定的ECMAScript脚本语言的基础上,经过修改和优化而指定的。它能够更好的支持诸如移动电话类的乍带宽通信设备,在WML编程中使用WML Script可以有效的增强客户端应用的灵活性,而且,我们也可以把WML Script作为一个工具使用,开发出功能强大的WAP网络应用和无限网页。本章我们将详细讲解WML Script1.1编程的基础预法制时,如基本规则、变量预数据类型、操作赋予表达式等。为了叙述上的简便,以后我们将“WML Script1.1”简称“WMLScript ”。 

WML 程序中调用WML Script函数

WML 的函数功能、逻辑运算功能等都是十分有限的,WMLScript提供了丰富的函数功能,我们在WAP应用开发可以使用WMLScript来增强WML编程。因此,WMLScript成为扩展WML编程能力的主要开发工具。 

WMLScript的主要优点及其字节码解释器

WMLScript具有一套定义好的字节码和一个解释器参考结构。无线网络传输中WMLScript的数据均以二进制格式进行传输,所以,用户可以使用乍带宽通信信道,从而能够保持客户端手机只需要最小限度的内存。ECMAScript修改后得到的WMLScript能够更快、更小、更容易的编译程序为字节码形式。所有这些特点,是WMLScript具备了WML所不能具备的很多优点和功能。 

使用WMLScript的主要优点

WMLScript的设计宗旨是为WMLScript系统提供一般的脚本处理能力,使用WMLScript我们可以进一步补充基于XML的WML语言的编程功能,开发针对乍带宽的网络应用及内容,如文本、图像、选择列表等,我们可以使用简单的格式编写出更灵活和更具可读性的用户界面。WMLScript具备的WML所不能具备的优点和功能,主要包括如下几个方面:

(1)检查用户输入的合法性:

(2)扩展用户浏览器的功能,比如允许程序员开发手机的电话呼叫、发送短信息、存储电话号码、管理电话簿或SIM卡等;

(3)生成用户端的确认、提示、警告信息或操作对话框,并使之快速显示在浏览器上;

(4)在用户浏览器的更改后,能够对浏览器端的软件和参数进行扩展与配置;

(5)最大程度克服客户端的乍带宽通信连接限制,并提供丰富的程序功能;

(6)补充WML并使之实现针对微型移动终端设备的多种服务,如支持高级用户界面、增加客户端智能型、提供用户浏览器外围功能的访问能力,以及在服务器与客户端浏览传输数据是减少带宽占用等。 

WMLScript的字节码解释器

在WMLScript的字节码解释器解释之前,WMLScript语言编写的文本格式的程序将被首先编译为二进制格式的代码。编译时,编译器通常先将WMLScript程序分成若干个编辑单位,每个单位的程序都包含一定数量的语句行和WMLScript函数,然后,WMLScript的编译器将按照这些编译单位,逐一将WMLScript程序作为输入内容,而把对应的字节码作为输出内容。当用户通过WAP手机调用WMLScript程序时,编译器的编码功能即被激活、执行。 

WMLScript基本规则

WMLScript在许多基本规则方面沿用了WML的做法。不过,由于WMLScript是以C语言为蓝本而指定的,所以它的语法特征和C语言非常相像。如果大家对C语言比较熟悉,那么学习和掌握这部分内容应当是比较容易的。

WMLScript与URL

与WML一样,WMLScript也沿用了WWW和HTML访问资源的URL、HTTP等规范,并扩大了URL使用的范围。在WMLScript中,不仅超链接、文件路径即文件名可以作为URL处理,外部函数、访问控制信息等也可以作为URL处理。

为此,WMLScript采用了WML的变通方法,即改进HTML命名资源为值的方式,采用程序段锚点(Fragment Anchor)的形式来处理资源定位。程序段锚点根据文档URL规则进行定义,并按照程序段标识符前加井字号(#)的方式书写。使用程序段锚点,WMLScript程序可以在WMLScript编译单位内可任意指定的函数,并可在调用该函数的同时传递所需的参数。

词法结构

WMLScript编程中的词法结构并不复杂,我们下面就从大小写敏感、空格、换行、注释即保留字等方面讲解相关的具体规则。

(1)内容类型。WMLScript的内容类型主要针对文件形式和二进制形式两种情况,类型结构可以在服务器端进行指定,具体形式为:

文本形式:text/vnd.wap.wmlscript;

二进制形式:application/vnd.wap.wmlscriptc。

具体指定方法我们在第4章已经介绍过,这里不再重述。

(2)大小写敏感。WMLScript1.1是一种大小写敏感的脚本语言。它所设计的各种关键字、变量和函数名都必须合理的使用大小写。

(3)空格和换行。一般情况下,WMLScript程序值形式将忽略所有的空格、制表符合换行符等。但如果把这些特殊字符通过代码进行表述,或者作为字符串进行处理时,WMLScript将不再忽略它们。了如,字符串"Oct 28,2001"中含有空格,该空格在执行时就不会被忽略,它与不含空格的字符串"Oct28,2001"是不同的。

(4)注释。与WML编程一样,在WMLScript脚本程序中也可以加入注释内容。注释内容不被程序执行,且注释不能嵌套。WMLScript的注释方法有两种:

其一,行注释。即使用双斜行号(//)引导以一行内容,这一行内容全部作为注释内容。如:

//这是以行注释,由双斜杠号开始到结束都是注释。

其二,块选择。即以符号“/*”开始,而以符号“/*”结束的期间所有内容都是注释内容。如:

/*这就是块注释,加在中间的内容就是注释内容*/

(5)数据类型与直接编码。WMLScript允许将4种类型的数据直接编码并可嵌套并可嵌如在程序之中。直接编码的4中数据类型为:整数、浮点数、字符串和布尔值。另外,“无效性”值也可直接编码” 1. 整数。当以十进制、十六进制或八进制方式使用整数时,可对这类整数进行直接编码。

编程序时,十进制的数字均不以0开头,只包含0~9的数值串;十六进制的数据以OX或者Ox开头,只包含0~9、a~f或者A~F的字符串;八进制的数均以0开头,只包含0~7的数字串。

2.浮点数。浮点数通常定义为含有小数点的数字,可以包含小数和指数部分。浮点数的形式较多,可以使十进制的整数或浮点数,可以是分数,也可以是指数;但一个浮点数必须至少有一个数。

指数是以e或E开头,后面跟着一个整数。指数是以10为底幂。例如:e0时10的零次幂,例如:e0时10的另次幂,e-2时10的负2次幂集等于0.01。指数可以带符号,正好(+)或者减号(-),它们分别代表是正指数和负指数。

3.字符串。字符串是指定义在成对的双引号("")或单引号(‘ ’)之间的内容。

由于WMLScript只允许使用成对的双引号或但引号来定义字符串,所以程序中使用一个单引号或一个双引号时就会出现编译错误。

考虑到有些特殊字符不能在字符串中直接显现出来,所以WMLScript提供了转译序列来表示这些特殊字符。

4.布尔型。它只是ture和false两个数值,用于表示WMLScript中的“真值”或“假值”。布尔型数据可参与异、或等运算,具体规则我们后面介绍。

5.无效型。也称为“空类型”,它是WMLScript支持的一个表示无效值的量,以invalid表示。该两与C语言中的NULL类似。

4.保留字。WMLScript中定义有一个保留字集合,含有一些表示特殊意义的单词这些次不能另外定义,也不能最为其他标识符。WMLScript中的保留字如下:

acces http agent if break isvalid continue meta header

div name div= path domain return else typeof while

equiv url extern use for user function var

另外,WMLScript还为将来的版本预留了一些保留字,主要有:

case finally catch import class private const public debugger

sizeof default struct do super enum switch export throw

extends try

WMLScript还有一些没有使用的保留字:

delete null in this lib void new with

7.标识符。WMLScript的标识符可以指定或命名3种元素:变量、函数和标注。标识符不能以数字开头,但能一段下划线(-)开头,而且,标识符不能是WMLScript的保留字。例如,timeOfDay、speed 、quality、HOME_ADDRESS、_myName、__、varO等都是合法的标识符;而以数字或非短下划线的特殊符号开头的字串,以及保留字等都属于不合法的标志赋,如while、for、if、my~name、$sys、123、3piecs、take.this等。

由于WMLScript是严格区分大小写的,所以字母相同但大小写不同的标识符不是同一个标识,例如,Work和work就是不同的标识符。

8.名称空间。WMLScript提供了比较自由的名称空间,同一标识符可以同时用作不同的目的。例如,作为某一函数名称的标识符,还可以同时用作变量名、函数参数、程序标注等,使用时他们的属性或值等并不相互影响。在下面的简单的例程中,myTest这一标识符即用作了函数名,又用作了变量名、函数参数名、函数参数名、常量名。显然,WMLScript的这一特定为我们编写程序提供了很大的方便。

WMLScript程序的基本书写规则

WMLScript程序的基本书本写规则:

1.程序由若干语句或函数组成,函数有由若干语句组成;

2.每个完整的语句后面必须加上分号(;),语句关键词语操作数之间必须有空间;分号(;)是WMLScript程序的组成部分;

3.函数体之间必须使用成对的花括号({ })括起来,而且函数结束时在右花括号(})的后面还要加上分号(;);函数说明部分,如函数名、函数类型、函数参数等要放在花括号({})的前面;

  4.有些语句可能也需要实用花括号({ })办含内容,这类语句通常也可以放在函数中,所以花括号({ })是可以嵌套的。

当然,不同的语句、参数、变量等元素在声明和书写时可能还有一些更细的要求,具体我们后面介绍这些元素是再专门给出,

变量与数据类型

变量即数据类型是所有编程语言的概念和组成部分,WMLScript对此也不例外。它对其变量使用方法和数据类型定义方法给出了详细的规定。变量通常与某数据之相对应,我们可以给变量赋值,并可在程序执行中改变变量的值。下面我们讲解WMLScript有关变量与数据类型的详细规定。

变量及其声明

变量是在WMLScript脚本程序中具有值的符号名,或说标识符。使用变量可以存储和改变程序中需要的数据。与C语言不同的是,WMLScript仅支持函数内定义的变量或用于传送数的参变量。

变量使用前必须进行声明,也就是定义变量,即指定变量的名字。声明变量的关键字是var,它的后面根上作为变量名的合法的标识符,并于最后加上分号(;),即完成一个量的声明。声明变量是可以使用var一次声明多个变量名,相邻变量之间使用都号(,)间隔。

一般情况下,我们在给变量命名的时候,都希望能够使用有意义的变量名。例如,当需要使用一个变量表示一本书的价格时,虽然将变量命名为j或book都没有什么错误,但若能命名为bookPrice则会是的WMLScript脚本程序具有更好的可读性,可以方便编程人员进行脚本的编写和调试工作。而且,由于WMLScript在给变量命名是不能使用保留字,所以考虑到避免由于一时的疏忽时变量名欲保留字发生冲突,我们建议使用多个单词组合在以其作为一个变量的名称,这是一个比较好的解决办法。例如,如果要定义一个变量来存储的、一本书的价格,那我们可以不妨使用bookPrice或者book_price作为变量的名称,这样,一方面可以时变量显得更加清晰,另一方面也可以避免变量与保留字的冲突问题。

以上只是我们对于变量命名的建议,并不是强制性的要求,用户完全可以不按照我们的要求来做,只要遵守WMLScript对于标识符命名的要求就可以了,但养成良好的编程风格不论是对编程人员还是对脚本编写人员来说,都是十分有意义的。

变量的作用域与生命期

一个变量的作用域是指在程序中能够引用这个变量的一段代码。由于WMLScript仅支持函数内定义的变量,所以WMLScript变量的作用与通常就是定义它们的那个函数。在该函数之外,变量不再发挥直接作用。

变量的生命起始值从变量声明开始到失效为止。变量的生命期也被称为变量的持久期、存活期。一个变量在定义它的整个函数内都是有效的,函数内的任何语句块都不会削减变量的生命期或限制变量的作用域。

如果一个变量未经生命就直接使用,或声明过后再次声明,都会破坏变量的生命期。前一种情况会导致变量没有开始声明期,即没有“生命”;而后一种情况则导致变量声明期没有结束以前就重新赋予声明期,即让它多次“降生”。这都会导致变量无效使用。下面函数中的变量使用就说明了这一问题:

function foo(){

x=1;//错误:变量使用前没有声明,改变量还没有“声明”。

var x,y,z;

y=x+3;

var zd =invalid

if(x){

var(y);//错误:这一变量已经声明,这里是重复声明。

};

};

变量的使用

WMLScript的变量只能在定义它的函数内使用。使用时需要声明变量,声明变量是可以同时对变量赋值,甚至对变量进行运算。例如,下面的简单函数就说明了变量的这种灵活的使用方法:

function ourAge(){

var myAge=38;

var yourAge=26;

var ourAge=myAge+yourAge;

return ourAge;

};

使用变量时可通过调用变量名字的形式来实现。上面例子中的“var ourAge=myAge+yourAge;”一句,通过调用变量名,变量ourAge对变量myAge和变量yourAge实行了求和操作。

变量类型与数据类型

WMLScript是一种“弱类型”的语言,及其变量没有确定的类型。WMLScript变量的类型有改变量所赋数据的类型决定,并根据数据类型的改变而改变。WMLScript只支持内部定义的数据,因此我们编写程序是无需指定WMLScript变量的类型,WMLScript减根据变量而赋数据的类型自动进行匹配。由于WMLScript的数据类型共有整数、浮点数、字符串、布尔型和“无效型”五种类型,所以WMLScript变量的类型所能匹配的也就是这五种类型。

变量值域

由于变量类型尤其所赋数据的类型决定,所以变量值与域其所赋数据的可取范围等价的。下面的我们就给出整数、浮点数、字符串和布尔型的区值范围,以参照确定应类型变量的值域。 1.整数的范围。WMLScript支持的整数是32位的,也就是说整数的区值范围是从2147483648到+2147483647。我们可以在程序运行期是用Lang函数来取得这些值,如:

Lang.maxInt(); //获取最大的整数

Lang.maxInt(); //获取最小的整数

2.浮点数的范围。它是指WMLScript浮点数的精度所能表示的最小和最大数值WMLScript支持32为的单精度浮点数,其最大至时3.40282347E+38,最小的非零的数是1.17549435E-38或更小(按照正常的精度)。

我们可以使用浮点Float函数库在程序运行其取得这些数值:

Float.maxFloa(); //获得WMLScript所支持的最大浮点值

Float.maxFloa(); //获得WMLScript所支持的最小浮点值
对于运行期出现的一些特殊的浮点数,WMLscript将按照下述规则处理:

其一,如果操作结果是一个不能被单精度浮点数所能表示的数值,那么该结果将被认为是invalid,即无效值;

其二,如果操作结果发生下溢出,那么结果将作为0.0处理:

其三,负的零和正的零是完全相等的。

3.字符串的范围。任何由于字母、数字或特殊字符组成的符号串都是WMLScript中定义的有关字符串的操作或String库中的函数控制字符串。

4.布尔型数据的范围。布尔型数据只有ture和flase两个取值,这也是布尔型变量的两种数值。我们可以使用布尔型数据取初始化或指定某一变量的数值,或将布尔值变量写入一个需要布尔值作为参数的语句。布尔值可以是数值运算的结果,也可以是逻辑运算的结果。

下面就是定义布尔型变量并赋初值的例句:

var truth=truth;

var lie=!truth;


操作符与表达式

在WMLScript中,表达式可以把变量、常量与操作符结合起来,经过运算能够产生一定的运算结果。表达式运算后产生的结果可以是整数型、浮点数型、字符串型或布尔型的数据。其实,对于表达式我们并不陌生,例如,1+2就是一个简单的表达式。

WMLScript的表达式主要有两种类型。一种是赋值表达式,即把数据赋给变量的一种表达式,例如,myBook=3,在这个表达式中,将3 赋给变量myBook,同时,这个表达式本身也有一个运算结果,那就是3。另外一种是运算表达式,它是指产生一个运算结果而不进行赋值操作的表达式,例如1+2就是一个运算表达式,在这个表达式运算产生的结果是3, 但这个表达式并没有把运算结果赋给变量。

在表达式运算的过程中,表达式中操作一个或这两个数据产生运算的符号做操作符,被操作符操作的数据称作操作数,在WMLScript中我们会使用到各种操作符,下面就对操作符及有关的表达式进行详细讲解。

赋值操作符

赋值操作符用于赋值操作,即给变量指定所需的数值,它能把有操作数的运算结果给做操作数,最简单的赋值操作符就是“=”,例如x=2,就是将2赋值给变量x。在如以下几行语句都是赋值操作:

var="abc";

var b=a;

b="def";

赋值操作符不需要指定使用对象,也不会改变赋值操作符右边变量的数值。WMLScript的赋值操作符主要包括以下几种:

1.=。用于赋值操作,将有操作数赋给左操作。

2 +=。将有操作数与左操作数进行相见运算,然后把运算结果赋值给左操作数。例如,假设x=3,那么x+=2运算后的结果为x=5。

+=是比较特别的操作符,因为它可以将两个字符串相连,所以+=操作符也可以对字符串进行操作,然后将连接后的字符串赋给左操作数。例如,假设x="Happy",那么x+="new Year"运算后结果是x="Happy New Year"。

3.-=。将左操作数简取有操作数,然后把运算结果赋值给左操作数。例如,假设x=3那么x-=运算后的结果为x=1。

4*=。将左操作属于有操作符进行相乘运算,然后把运算结果赋值给左操作数。例如,假设x=6,那么x*=2运算后的结果为x=6。

5/=。将右操作属于右操作符进行相乘运算,然后把运算结果赋值给左操作数。例如,假设x=6,那么x*=2运算后的结果为x=6。

6div=。拥有操作数处理左操作数,然后把运算结果中的整数部分赋值给左操作数,例如x=7,那么xdiv=2运算后的结果为x=3。

7%=。功能是求余数并赋值,用右操作数除以做操作数,最后把运算得到的余数值给操作数。例如,假设x=7,那么x%=3运算后的结果为x=1。

8<<=。功能是带符号左位移并赋值,即将左操作和右操作数进行左位移操作,在将结果赋给左操作数。

9>>=。可将左操作和右操作进行右操作进行补零右位移操作,在将结果赋给左操作数。

4.5.2 数学运算操作符

数学运算操作符可以对数值类型的操作数进行运算,然后返回一个数值类型的运算结果。

1+。这是加运算操作等,它对应着数学运算中的加法运算,例如表达式1+2的运算结果为3。

加操作符还可以对字符串类型的操作数进行运算,然后将两个字符串相连起来作为运算

2- 。即检操作符,对应着速学运算中的减法运算,例如表达式2-1的运算结果为1。

同时,“-”还是一个取负操作符,当它作为取负操作符的是一个操作数,取负操作符的功能使返回操作数的相反数。

3*。这是乘操作符,它对应着数学运算中的乘法运算,例如表达式2*3的运算结果为6。

4/。即除操作符,对应着数学运算中的除法运算,但WMLScript中的除法运算有些特别,在WMLScript中,除法运算后的结果是一个浮点数,而不想C语言或者Java语言那样在整数进行除法运算式井运算结果强行转化整数。在WMLScript中,1/2=0.5,而在Jave中,1/2=0。

5div。这是整除操作符,对应着数学运算中的整数运算,运算后的结果一个整数,这一点与C语言或者Java语言中的情况是一样的,可以在整数进行除法运算式将运算结果强行转换整数。

6%。即取模操作符,它对应着数学运算中的取莫运算,也就是将两个操作相除,返回相除后的余数。

取模操作符主要用于判断一个数字是否能被另一个数字整除。

((the Year%3==0))&&(the Year%100!=0))||(the Year%400==0)

其中&&代表的是逻辑运算中的与运算,||代表的是逻辑运算中的或运算,关于逻辑运算,我们后面会详细介绍。

7++。这是递增操作符,它只有一个操作数,操作可以在操作符的左边,也可以在操作符的右边,它所完成的运算操作是将操作数加1。假设操作数名称为j,值为2,那么++j加1,然后返回j的值3;而j++则实现返回j的值2,然后将j加1。

在循环中,我们常常会用到递增操作符的作用正好相反。递减操作完成的运算操作是经操作数减1。例如,假设操作数名称为j,值为2,那么--j先将j减1,然后返回的值1;而j--是先返回j的值2,然后将j减1。

位操作符

为操作符在运算实现将操作转化32位的二进制数,然后对每个操作数分别按位进行运算,运算后在将二进制的结果按照标准WMLScript数值类型返回运算结束。

1&。这是为与操作符,它可以对两个操作数按位进行于操作,其运算规则是:

0&0=0,0&1=0,1&0=0,1&1=1

2|。这是位或操作符,它可以对两个操作数按位进行或操作,运算规则是:

0|0=0 ,0|1=1,1|0=1,1|1=1

3^。这是唯一或操作符,它可以对两个操作按位进行异或操作,其运算规则是:0^0=0,0^1=1,1^0=1,1^1=0

4~。这是位非操作符,它只有一个操作数,可对操作数按位进行非操作,运算规则是:~0=1,~=0

5<<。这是左移操作,它可以对左操作数进行向左一位的操作,由操作数给定了要移动的位数,在移动过程中,左操作数的最低为补充0。

6>>。这是右移操作符,它可以对左操作数进行向右移位的操作,由操作数给定要移动的位数,在移位的过程中,丢弃向右移的位。

7>>>。这是填0右移操作符,它与右移操作符相似。当对证正数进行操作时,它们的效果完全相同;不同之处在于,当进行负整数右移操作时,因为负责转化为二进制后,最高为1,所以在进行右移操作后,最高位仍然补充1,而在进行填0右移操作时,最高为补充的是0,因此,这是负数将转化为正数。

逻辑操作符

逻辑操作符可以将布尔类型的表达式组合起来,完成逻辑运算操作,然后返回逻辑运算的结果——真或假,这样就可以完成比较复杂的逻辑判断工作。逻辑操作共有3种;

1&&。即逻辑与操作符它只有在两个操作数都为ture的时候,返回结果为ture,在其他情况下,返回结果为false或者invalid。

2||。这是或操作符,它在两个操作数至少有一个为ture的时候,返回结果为ture,在其他情况下,返回结果为false或者invalid。

3!。即非操作符,它只有一个操作数。当操作数为ture时,返回结果为flase;返回结果为ture.

比较操作符

比较操作符可以把操作数进行比较,然后返回一个逻辑值,表明这个比较操作的结果是否为真。比较操作的操作数可以是数值类型或者字符串类型的数据。比较操作符也常被称为关系运算符。

WMLScript支持的比较操作符共有6种,下面被介绍一下。

1. ==。即等于操作符,它可以比较两个操作数是否相等。如果两个操作数相等,则返回ture,否则返回false

2. !=。即不等操作符。它可以比较两个操作数是否相等。如果两个操作数相等,则返回false,否则返回ture。

3. >。即大于操作等。其运算规则时,如果左操作数大于右操作数,则返回ture。

 

作为一种编辑语言,WMLScript提供了强大的函数、语句和库功能,以及外部编辑、访问控制等支持,同时对程序运行中可能产生的错误给出了检测手段和具体的解决办法。这些内容属于WMLScript的脚本程序设计知识和进一步的编程规定,我们本章就对此进行详细介绍。

语句

前面我们学习了变量、操作符和表达式,但仅由这些内容并不能完成某个完整的功能,因为他们不能形成完整的操作或处理程序。变量就如同与严重的单词,表达式如语言中的词组,他们都不能表达一个完整的意思;只有语句,是语言中完整的句子,能够表达完整的意思并实现某个完整的功能。WML Script提供了丰富的语句功能,使用这些语句我们可以在WML的卡片中建立交互功能和其他需要的复杂功能。

在WML Script中,每条语句的后面都需要以一个分号(;)结尾。为了养成严谨的编程风格,建议大家编写脚本时,语句后一定要加上分号(;),这也有助于我们形成一种良好的编程习惯。

WML Script语句的书写和排列格式比较自由。我们可以在同一程序行中连续写上多个语句,也可以把同一语句分成多行排列。WML Script将根据分号(;)来确定语句的具体内容。

WML Script的语句主要包括两类。第一类是基本语句,如空语句、表达式语句、块语句、变量语句和return语句等;第二类是条件语句,如if语句;第三类是循环语句,如while语句、for语句、break语句和continue语句等。下面我们分别讲解这些语句的语法、功能和使用方法。

基本语句

WML Script基本语句主要用于程序格式控制和变量声明,其中有些语句我们已经不太陌生了。

空语句

空语句用于定义一个空的程序行,它没有任何标识符和操作符,也不执行任何操作。它只是以分号(;)结束。其语法格式为:



显然,空语句是一种十分特殊的语句。由是我们为了让程序具有更好的可读性,通常在程序中的适当地方加上几个空语句,以起到分隔或突出的作用。例如,下面的几行程序中就含有一个空语句:

str="Hello";

val=25;

;

MyVal=val*val+5;

alert("Hi,Hi!!!");

再如,while语句用于判断一个条件并在条件满足的时候执行相应的任务,但如果希望条件满足的时候什么也不作,那么就可以给它配上一个空语句,使之条件满足的执行空操作:

while(!poll(device));

这实际上是while语句和空语句组成的两条语句。其中的分号(;)在这里就代表了空语句。这两条语句的作用是在poll()函数为真()之前一直等待。

表达式语句

表达式语句用于向变量赋值,或进行数学计算,或进行函数调用。表达式语句也是我们最常用的一种语句,语法格式为:

表达式;

下面几行程序都是合法的表达式语句:

str="Hey"+yourName;

val3=prevVal+4
counter++;

myValue1=counter,myValue2=val3
alert("Watch out!");

retVal=16*Lang.max(val3,counter);

块语句

块语句使用两个花括号({ })包含一个语句集,形成一个语句体。WML Script的许多语句都需要使用块语句来实现语句体,快语句的语法格式为:

{

语句列表;

}

下面的简单程序就是使用块语句的例子:

}

vari=0;
var x=Lang.abs(b);

popUp("Remember!");

}

变量语句

变量语句用于生命变量并可进行变量的初始化赋值。如果用户不赋值,那么WML Script会自动将变量语句生命的变量赋予一个空字符串("")。基本的语法格式为:

var 变量名;

如果像一次生命多个变量,则相邻变量名之间使用逗号(,)间隔,其语法格式为:

VAR 变量名1,变量名2......,变量名n;

如果想在生命变量时同时初始化变量,则可按如下语法格式书写:

var 变量名=初始化

为便于大家更好的掌握变量语句,我们给出一个多出使用该语句的程序:

function count(stu){

var result=0; //声明变量的同时初始化变量

while(str!=""){

var ind=0; //每次循环都初始化一次

// 为退出循环,本块语句内应当提供修改变量str值的语句

};

return result

};

function example(param){

var a=0;

if(param>a){

var b=a+1; //声明b变量的同时使用a变量初始化b变量
}else{

var b=a+2; //声明c变量的同时使用a变量初始化c变量

};

return a; //返回a变量的值

};

注释语句

严格来讲,注释语句在WML Script中还不算是真正的语句,它只是一种前指向的规定。不过它也有严格的语法和标注方法,所以我们这里还是像其他编程语言处理的一样,把WML Script注释方法以语句的形式介绍一下。

注释在程序执行的时候没有任何作用,但是可以用于对程序进行解释,则增强程序的可读性。为了形成良好的编程风格,我们应该养成书写注释的良好习惯,注释有两种表达方式:

(1)通过双斜线注释一行,这样在双斜先后的字符将成为注释而不被执行。该注释行可以单独一行书写,也可以放在其他语句的后面。

例如,可以进行如下所示的注释:

//变量j用于小数每月的天数

j=0; //我们这里将j赋值为0

(2)通过符号“/*”和“*/”来规定注释语句,这种注释方式可以进行多行注释,符号“/*”和“*/”之间的内容就是注释语句。例如,可以进行如下所示的多行注释:

/*我们定义了两个变量:i和j。其中:

i用于描述每年中的月数,

而j用于描述每月的天数*/

j=0; /*我们这里将j赋值为0*/

return语句

return语句主要用在函数体中,在函数结束前,可以通过return语句,把函数处理的结果返回给调用函数的语句。它的语法格式如下:

return表达式;

下面的函数给出了应用return语句的例子:

function square(x){

if(!(Lang.isFloat(x)))return invalid;

return x*x

};


条件语句

在条件语句中,当满足某种条件时 ,就会执行指定的一些代码,而在代码组另外某种条件时,则会执行另外一些代码。WML Script的条件语句就是if...else语句,它的一般表达相识如下:

if(条件){

代码块1

}

else{

代码块2

}

这样,当条件满足时,就执行代码块1;如果条件不满足则执行代码块2。代码块和代码块2中如果只有一个条语句,那么,花括号({ })就可以省略;而如果有多条语句,则必须实用花括号将代码块包括在其中。在if...else语句种,其中的else部分是可选的,也就是说,我们可以使用如下的表达形式:

if(条件){

代码块

}

这样,当条件满足时,就执行代码块,如果条件不满足则什么也不做。

例如,如果我们需要对一个学生的成绩进行判定,如果大于等于60分,那么我们就认为该学生成绩合格了,反之则认为不合格,同时一并将状态记录到变量status种,相应的WMLScript语句如下所示:

if(score>=60) status="pass";

else status="fail";

再如,我们可以通过对天气是否阳光普照(sunShines)的情况进行判断,来给变量myDay赋值,并累计好天气(goodDays)的天数。程序如下:

if(sunShines) {

myDay="Good";

goodDays++;

}else

myDays="Oh well..."; 

循环语句

使用循环语句可以反复执行某个代码块,直到循环结束条件满足后才停止执行。WML Script中有两种循环语句:for语句和while语句,同时还有两终于循环密切相关的操作语言:break语句和continue语句。

for语句

for语句可以创建一个带条件的循环,它还有3个可选的条件表达式,用于控制循环。这3个条件表达式放在一个括号里,并以分号(;)间隔。for语句的一般语法形式如下:

for(初始表达式;循环条件;递增表达式){

代码块

}


for语句的执行主要包括以下几个步骤:

(1)执行初始表达式。在一般情况下,初始表达式完成的功能是在循环中对循环计数器赋初值。所以在这种意义上,初始表达式也可以采用“var 变量声明列表;”的形式来定义。

(2)判断循环条件。如果循环条件为真(ture),则执行循环体中的语句,即至步骤(3);否则,循环条件为假(false)或者invalid,就结束循环;

(3)执行循环代码。然后,在执行递增表达式。一般情况下,我们在递增表达式中对循环计数器进行处理,最后在返回步骤2执行。

例如,下面的for语句建立了一个循环。初始表达式为定义变量index并付初值0,循环条件为index<100,递增表达式为每循环一次index增加1。当index增加到100时候,循环结束。程序如下:

for(var index=0;index<100;index++){

count+=index;

myFunc(count);

};

while 语句

while语句也可常见一个循环,它的一般语法表达式如下:

while(循环条件){

代码块

}


while语句的执行过程包括以下几个步骤:

(1)判断循环条件是否为真。如果循环条件为真,则执行循环;如果为假或为invalid,则跳出循环。

(2)执行循环中的代码块,然后返回步骤(1)

下面的程序就是使用while语句的简单例子:

var counter=0

var total=0

while(counter<3){

counter++;

total+=c;

};

其中建立的循环仅当变量counter的值小于3时执行,否则就结束循环。

显然,如果循环条件不能为假或为invalid,那么while循环就会无休止的反复执行下去。因此,我们在代码块中一定要有能够改变循环条件的变量,否则,就很有可能会陷入死循环而不能终止程序,下面就是一个死循环的例子:

var x=1;

var y=0;

while(x<=1){

y=x+1;

}


这个程序中,因为变量x的值在循环中不能发生变化,所以循环条件在判断的时候永远为真,所以成为了死循环。因此,对于while语句我们往往使用如下所示的语法形式:

初始表达式

while(循环条件){

代码块

递增表达式

}

这种情况下,while语句的功能和for语句的功能就一样了,不过用while语句编写的程序可读性更强一些。所以我们也可以采用while语句来完成index增加到100的循环。

程序如下:

var index=0

while (index<100){

counter+=index;

myFunc(count);

index++;

};

break语句

为了更好的解决死循环问题,WML Script项大多数编成语言一样提供了break语句。break语句可以使程序执行跳出循环。不论是for语句还是while语句,只要在循环中使用了break语句,那么程序执行到break语句后就立即跳出当前循环,然后继续执行下去。

break语句的予发行时如下:

break;

例如,在下面的函数中我们使用了break语句,它是当index=3时跳出循环。如果不是用该语句,函数中的while循环直到index=6时才可以结束。程序如下:

funcition testBreak(x){

var index=0;

while(index<6){

if(index==3)break;

index++

};

retrun index*x;




continue语句

continue语句的功能和break语句的功能看起来有些类似,但实际上却不一样。循环执行时遇到break语句通常是跳出当前循环,但循环执行到continue语句并不跳出当前循环,而是不执行循环中在continue语句后面的代码块,直接结束循环的本轮运行,然后马上开始下一轮循环的运行。

在while语句的循环中,遇到continue语句后,程序会直接判断循环条件从而开始下一轮循环。在for语句的循环中,遇到continue语句后程序会直接执行递增表达式,然后判断循环条件从而开始下一轮循环。

例如,我们想利用for循环求1到10之间偶数的和,其WML Script语句如下:

var sum=0;

for (var j=1;j<=10;j++){

if(j%2!=0)

continue;

sun+j;

};

在这个例子中,在j%2!=0的情况下,也就是j为奇数的情况下,程序执行continue语句,这时,并没有如同break语句一样跳出循环的运行,而是不执行循环中后面的语句而直接执行递增表达式开始下一轮循环的执行,这样,就可以不将其数j的之类即如总和中。

再如,我们想利用while循环求0到4之间出3以外几个数的和,则可以使用continue语句进行控制。程序如下;

var index=0;

var count=0;

while (index<5){

index++;

if(index==3)

continue;

cont+=index;

};


这以程序中,当index等于3时,“index==3”为真,所以执行continue语句,不再把此时index的值加大count中,而是开始下一轮的循环。
函数的声明与调用

在WML Script中,函数是一种能够完成某种功能的代码块,并可以在脚本中被事件处理或被其他语句调用,也可以被WML程序所处理和调用。一般地,当我们编写WML Script脚本时,如果脚本中的代码长度还是很长,则一般还可以根据功能将函数再进行划分,分成为几个功能更加单一的函数。虽然说这样对长代码的处理方法并不是编写脚本程序的强制性要求,但通过函数的划分和运用,我们可以使得WML Script脚本具有更好的可读性,也便于我们对脚本程序的编写与调试。而且,如果在某些脚本中有多处完全相同的代码块,那么我们也可以将这些代码快些为一个函数,然后在脚本中调用这个函数,从而提高代码的重要性,简化代码的编写工作。

WML Script的函数共用和Jave语言、C/C++语言的函数有所不同。我们知道,Jave语言、C/C++语言中有函数和过程之分,函数能够完成一定的功能并有返回值,而过程进可完成一定的功能但没有返回值。可是,WML Script中并不区分函数和过程,因为它只有函数,没有过程。WML Script的函数完成一定功能后始终有返回值,不过返回值分两种情况,即非空的返回值和空字符串("")形式的返回值。前者是真正的返回值,后者其实相当于没有返回值。也就是说,WML Script中的函数同时具有其他语言中的函数和过程的功能。

函数的声明

使用函数时,要根据函数的调用使用,而调用函数前必须声明函数,也就是需要先定义函数。WML Script中定义函数的一般方式如下:

function函数名(参数列表)

{

代码块

};

另外,WML Script规定使用extern关键字来声明一个外部函数:

extern function函数名(参数列表)

{

代码块

};

从中可以看出,函数的定义有以下3部分组成:

(1)函数名。即函数的名称,其命名规则应遵守WML Script的标识规则。调用函数时都是通过函数名进行调用的,所以函数必须要有函数名。

函数命名时,一般要使用能够描述函数功能的但此来作为函数名,也可以使用多个单词组合进行命名,这样做的好处是能够提高WML Script脚本的可读性。

函数名在同一个WML Script脚本文件里必须是唯一的。如若不然,则会导致函数定义混乱。

(2)参数列表。即调用函数时需要的参数。参数列表通常是可选的,有的函数需要,有的函数可能不需要。参数列表的作用是向函数传递一些参数,使得函数可以直接使用这些参数的值。

调用函数的时候,参数个数和类型必须和函数定义示所声明的参数个数即类型保持一致。而且函数的参数就如同似函数体内的局部变量,它们在函数调用的时候被初始化。

(3)代码块。它是函数的主体部分。代码块中的代码包含在以对花括号({ })中,代码块可以执行并完成函数的功能。编写代码块是应当遵循WML Script的编程规则。

有时,函数需要返回一个值给调用函数的语句,则应该在代码块的后面一行使用return语句,返回所需的数值。

与C/C++等语言类似,WML Script的函数是可以嵌套的,以就是说,在一个函数中还可以调用其他函数。但是,函数声明是不能嵌套,这是WML Script的强制性规定。

下面几行语句就是定义函数的简单例子:

function currencyConverter(currency,exchangeRate)

{

return currency*exchangeRate;

};


其中,该函数的名称为currencyConverter,参数有currency和exchangeRate两个,函数代码块包含一条语句,用于返回currency和exchangeRate的乘积。

下面是一个使用extern定义外部函数的例子。其中函数名为textIt,它没有参数,函数体中定义了两个赋值变量,一个赋整数,一个赋函数值:

extern function testIt(){

var USD=10;

var FIM =currencyConverter(USD,5.3)

};

函数的调用

编写好的函数必须经过合法的调用,才可以发挥它应用的作用。函数调用将返回一个值,比如一个计算结果。WML Script中的函数主要可以分为内部函数、外部函数和库函数,下面我们就介绍这3类函数的调用方法。

内部函数

所谓内部函数是指函数的定义与其调用函数在同一个脚本文件内的函数,对内部函数的调用称为内部调用。内部函数的调用非常简单,只需提供函数名和所需参数值即可,参数值必须和函数定义时指定的参数个数即类型一致。而且函数调用需要使用操作符来接收或处理被调用的返回值。

内部函数可以在其定义之前调用,也可以在其定义之后调用。例如,下面就是一个在函数定义之后调用的例子。

function test1(val){

return val*val;

};

function test2(param){

return test1(param+1);

};

这个例子中定义了两个函数test1和test2。test1函数用于计算给定参数值的平方并将结果返回;test2函数将给定的参数值加1,然后这个和为参数值,来调用test1函数,得到结果后在将给结果返回到调用test2函数的语句。

注意,本例中test2函数调用了test1函数,这种在函数中调用其他函数的方法称为函数调用嵌套。WML Script的内部函数、外部函数和库函数都支持嵌套调用,后面我们专门介绍这方面的内容。

外部函数

外部函数使一个在WML Scrupt外部文件中定义的函数。调用外部函数的方法与调用内部函数的方法基本类似,不同之处在于调用处外部函数时一是要指定外部文件的地址即名称,二是要在调用的外部函数名的前面加上外部文件的名称。

WML Script规则使用use url来指定外部文件,语法格式为:

use url还有外部函数的外部文件名 外部文件所在的URL;

这样,WML Script的预编译头就可以将外部文件映射为一个可以在内部使用的标识。然后,使用这个标识并加上井号键(#)和标准的函数调用即可实现外部函数调用,语法格式为:

外部文件名#外部函数(参数列表);

例如,http://www.host.com/script下有我们需要的外部文件,名为OtherScript,所以我们可使用use url来指定该文件:

use url OtherScript"http://www.host.com/script"

这一外部文件中含有我们需要调用的外部函数testme,则可采用“外部文件名#外部函数(参数列表)”的形式来调用它:

OtherScript#testme(param+1);

这个例子完整的写出来,就是下面的程序:

use url OtherScript"http://www.host.com/script"

function test(param){

return OtherScript#testme(param+1);

};

库函数

特别指定,WML Script的库函数一律是指它的标准库函数。因为与标准库函数对应,WML Script还有一些非标准的库函数。我们这里先介绍标准库函数,非标准库函数后面再介绍。

所有库函数都有所数的库,函数的库中通常含有一类函数。因此,调用某个库函数时,一要指定它的库名,二要指定它的函数名。WML Script规定,调用标准库函数时可以通过在函数库的名字后面加上句点号(.)和库函数的标准调用来实现,语法格式为:

函数库名.函数名(参数列表);

例如,WML Script的浮点库即Float库中有一个开根方的函数sqrt,该函数只有一个参数,那么调用squrt库函数的方法为:

Float.sqrt(number);//这里要求number大于或等于0

下面给出了调用库函数的简单例子。首先一param参数值调用Lang.abs()函数,返回结果加1后再作为参数调用Float.sqrt()函数,它的返回结果作为内部函数test的返回值:

function test(param){

return Float.sqrt(Lang.abs(param)+1);

};

函数的嵌套调用

WML Script的函数定义都是互相平行、独立的,定义函数的时候我们不能在一个函数内定义另外一个函数,也就是说,函数定义是不能嵌套的。但是,函数调用确是可以嵌套的,也就是说,我们可以在调用一个函数的过程中调用另外一个函数。

它的执行过程是:

(1)执行a函数开头部分;

(2)遇到调用b函数的操作语句,流程则专区执行b函数;

(3)执行b函数开头部分;

(4)遇到调用c函数的操作语句,流程则专区执行c函数;

(5)执行b函数,如果没有其他嵌套的函数,则完成c函数的全部操作;

(6)返回调用c函数的语句,即返回到b函数;

(7)继续执行b函数中尚未执行的操作,直到b函数结束;

(8)返回a函数中调用b函数的语句;

(9)继续执行a函数的剩余操作,直到函数结束。

function myFunC(param1){

return param1*param1=Float.squt(Lang.abs(param)+1);

};

function myFunB(param0){

return myFunC(param0+1)*|param0+12;

};

function myFunA(param){

return myFunB(param*param+1);

};


预编译

WML Script的预编译主要用于在编译阶段控制编译器的行为。与编译头一般在文件开头和函数声明之前指定,WML Script规定所有的预编译头都是一关键词use加上指定的预编译属性进行指定。

在大多数的编程中,我们比较长用的预编译行为主要涉及外部文件声明、访问权和Meta信息设置。

外部文件

我们知道,使用URL地址可以定位一个WML Script文件。利用该URL地址;在WML Script编程中我们可以通过预编译来调用WML Script的外部文件,外部文件预编译头的声明方法是use url,其语法格式如下:

use url外部文件名 "URL"地址

这样,我们在当前文件的编程中就可以使用该预编译头声明的外部文件,从而可以调用该外部文件的函数。其语法格式为:

外部文件名#函数名(参数列表);

例如,我们希望在当前的WML Script程序中调用OtherScript外部文件中的check()函数,而且我们知道OtherScript文件的URL地址为http://www.host.com/app/script。因此,我们可以使用use url来声明这一外部文件:

use url OtherScript"http://www.host.com/script"

随后,我们就可以在程序中调用OtherScript中的check()函数了:

function test(par1,par2)

{

return OtherScript#check(par1,parr2);

};

其中调用执行的过程如下:

(1)找到WML Script外部文件的URL地址;

(2)当前函数从指定的URL地址值装载外部文件;

(3)检测外部文件的内容,并执行其中的check()函数。

ure url 预编译头指定的外部文件名在当前程序中必须唯一,用户不能指定不同URL地址的同名外部文件,否则在调用外部文件时就会发生混乱。

另外,use url预编译头中的URL地址也可以是相对URL地址。相对URL的起始位置是当前程序文件所在的位置,并在此基础上根据URL进行定位。

如果URL地址中的字符包含有转义字符,则WML Script将根据转义要求进行转义。不过,程序在编译的时候编译器并不会对他们进行转义,而是在程序执行时完成,检查URL格式和URL地址的有效性。

访问权限

我们可以使用访问权限预编译设保护文件的内容,实现访问控制。WML Script编程中,必须在调用外部函数之前使用访问权限预编译头声明外部文件的访问权限。不过,WML Script访问权限检查的缺省值是不进行检查,即disabled.但访问权限一经声明,以后当调用外部函数的时候,编译器就会检查外部文件的访问权限,以决定调用这是否有权使用该文件及其内含函数。

访问权限预编译头的声明方法是use access,其语法格式如下:

use access domain操作域名 path操作路径:

访问权限预编译头通过指定domain和path属性来决定编译器将要进行什么样的检查工作。如果文件有domain或者path属性,那么文件所在的URL就必须和属性中的值一致。比较时,域和路径都依据URL大写规则进行比较。具体的比较预则如下:

(1)操作域与URL中的域后缀相匹配。与后缀匹配是值所有的子域从后向前都必须一致。例如:www.wapforum.org和wapforum.org相匹配,而与forum.org并不匹配。

(2)操作路径和URL中的路径前缀相匹配。路径前缀匹配是值从前向后必须一致。例如:“/X/Y”与“/X”相匹配,而不是和“/XZ”相匹配。

(3)却省的domain数行为当前的文件域,就是“/”。

不过,为了简化编程,有时WMLScript并不需要直到外部文件的绝对路径,我们只需提供文件的相对URL即可,用户浏览器执行程序是卡相对路径自动转换为绝对路径,根据路径属性进行匹配。例如:如果访问权限预编译头及其指定属性为:

use access domain"wapforum.org"path"/finance";

则可以使用以下的路径来调用指定文件中的外部函数,它们都符合相对URL地址匹配规则:

http://wapforum.org/finance/money.cgi

http://www. wapforum.org/finance/money.cgi

http://www. wapforum.org/finance/demos/packages.cgi?x+123&y+456

而以下的路径调用则非法的,因为它们或者操作域不对,或者URL地址不能与指定的相对URL相匹配:

heep//www.test.net/finance

http//www.qapforum.org/internal/foo.wml

需要强调指出的是,WML Script规定,同一程序中只能定义一个访问权限与编译头,否则就会导致编译错误。

Meta 信息

我们还可以通过与编译头的形式声明WML Script文件的Meta信息。Meta信息主要用于指定文件所需Mete属性的属性名(Property name)、属性值(Content)以及文件的配置(信息),属性都属于字符串类型的数据。Mate信息域编译头使用use meta声明,其语法格式为:

usr meta 属性 该属性Meta信息:

Meta的属性主要包括Name、HTTP Equiv和User Agent三种,下面我们分别讲解它们的声明方法:

(1)Name。该属性用于指定服务器使用的Meta信息。这些信息仅供服务使用,用户浏览器并不理会这些信息。

例如,以下Name属性的Meta信息指定了服务器的创建时间:

use meta name "Created""26-June-2000";

该信息只会作用于服务器,而不会影响用户浏览器的操作。

(2)HTTP Equiv。该属性用于指定需要解释为HTTP头的Meta信息。对于已经编译的文件来说,当它到达用户浏览器前,WML Script将根据HTTP Equiv属性指定的Meta信息将文件转换为WSP或HTTP的响应头,进行文件的解释和执行。

例如,以下声明的http equiv属性指定按照脚本语言的关键字来解释当前文件:

use meta http equiv"Keywords""Script,Language";

(3)User Agent。该属性用于定义用户浏览器使用的数据类型。例如:

use meta user agent"Type""Test";

它指定当前数据必须立即发送给用户浏览器,然后马上清除掉。

执行时的错误检测与处理

WML Script函数的功能提供用户服务,并希望用户界面能在任何的状况下运作顺利,因此错误的处理是最大的课题,这表示了语言可能不提供预期的机制,如他应该可以防止错误发生或提醒用户注意并采取适当的动作,种植储蓄执行是最后的手段。下面几个小节列出了当为码下载并执行时会发生的错误,一些程序上的错误并不在谈论的范围(如无穷循环),像这类的例子就需要手动来终止。

错误检测

错误检测工具能让你检测错误但会干扰系统的动作,因为WML Script是弱格式语言,所以由一些特殊功能的工具来检测有invalid数据格式所引起的错误:

检测给定的变量包含的是正确值:WML Scritp含有格式确认函数库程序如:Lang.isInt()Lang.isFloat()、Lang.parseInt()、Lang.parseFloat。

检测给定的变量包含的只是正确的格式:WMLScript含有运算符typeof与isvalid能让你使用。

错误处理

错误处理是在发生错误之后,有些状况是错误检测无法防止的,如内存限制后外部信号等,或者是数据很难处理,如溢出(overflow)或亏失(underflow),而这些状况可以分为两类:

严重错误(fatalerror):这种错误会造成程序终止,因为WML Scritp程序会让一些用户界面调用,程序终止通常会跟调用它的用户界面发出信号,用户界面就会告知用户这个错误。

错误(non-fatalerrow):这种错误会把信号传回程序,如一些特殊的值,然后由程序决定所要采取的行动。

下列的错误是根据他们的严重性来区分。

严重错误(fatalerror)

下面的小节会讨论WML Script的严重错误。

位码错误(bytedode error)

这些错误跟位码与由WML Script位码解译器所执行的指令有关他们指出了错误的元素群、无效的指令、指令所使用的参数无效,或指令无法执行。

验证错误(verification failed)

说明:调用的程序中的特定位码无法通过验证。
如何发生:每次程序试着用外部程序。

范例:var a = 3*OtherScript#doThis(param)
严重性:严重。

判定状况:当检测位码验证式。
解决方法:终止程序与WML Script解译其调用者的错误信号。

说明:调用一个函数库程序时发生严重错误。

如何发生:每次调用函数库程序。
范例:var a = string.format(param)

严重性:严重。
判定状况:无

解决方法:终止程序与WML Script解译其调用者的错误信号。
说明:调用函数参数的数目跟被调用函数的参数数目不符合。

如何发生:调用外部程序。
范例:编译器参生一个无效的参数给予指令使用,或者被调用的程序参数数目改变了。

严重性:严重。
判定状况:无

严重性:严重。
解决方案:终止程序与WML Script解译器调用着的错误信号。

说明: 在特定的程序中找不到所需要的外部程序。

如何发生:调用外部程序。
范例: var a =3*OtherScript#doThis(param)

严重性:严重。
判定状况:无

解决方案:终止程序与WML Script解译器调用着的错误信号。

说明: 由于在网络服务器的程序存取又无法修复的错误或特定程序并不在网络服务器中所引起的程序无法载入。

如何发生:调用外部程序。
范例: var a =3*OtherScript#doThis(param)

严重性:严重。
判定状况:无

解决方案:终止程序与WML Script解译器调用着的错误信号。

说明: 存取错误,所调用的外部程序加了保护。
如何发生:调用外部程序

范例:var a =3*OtherScript#doThis(param)
严重性:严重。

判定状况:无
解决方案:终止程序与WML Script解译器调用着的错误信号。

说明: 因为程序错误造成stack underflow。

如何发生:程序要取出(pop)一个空堆
范例: 当组译器产生错误码。

严重性:严重。
判定状况:无

解决方案:终止程序与WML Script解译器调用着的错误信号。

说明:执行调用Lang.abort() 是发生的错误。
如何发生:每当程序调用Lang.abort()函数。

范例: Lang.abort("unrecoverable error")
严重性:严重。

判定状况:无
解决方案:终止程序与WML Script解译器调用着的错误信号。

说明:发生堆栈溢出。

如何发生:程序资源太多或要推入太多的变量到运算之中。
范例: function f|(x)(f(x+1););

严重性:严重。
判定状况:无

解决方案:终止程序与WML Script解译器调用着的错误信号。

说明:没有多余的内存可供解译器使用。

如何发生:作业系统无法配置多余的空间给解译器适使用。
范例: function f(x){

x=x+"abcdefghijklmnopqrstuvxyz";
f(x) ;

};
严重性:严重。

判定状况:无
解决方案:终止程序与WML Script解译器调用着的错误信号。

说明:用户终止程序的执行(如按下reset钮)

如何发生:随时。
范例: 当应用程序正在执行是用户按下reset钮。

严重性:严重。
判定状况:无

解决方案:终止程序与WML Script解译器调用着的错误信号。

说明:当程序执行中,发生了外部严重的错误。
如何发生:随时。

范例: 电力微弱,系统自动。
严重性:严重。

判定状况:无
解决方案:终止程序与WML Script解译器调用着的错误信号。

一般错误(Nonfatal error)

下面说明了WML Script的一般错误:

计算错误(computational error)

这些错误是由于WML Script数学上的运算所造成。

除以零(divide by zero)

说明:发生了除以零的状况
如何发生:当程序中有除以零的状况。

范例:var a= 10;
var b= 0;

var x= a/b;
var y= a div b;

var z= a%b;
a/=b;

严重性: 一般。
判定状况:高

解决方案:产生结果为invalid。

说明:发生了除以零的状况
如何发生:程序要执行浮点数运算。

范例:var a = Float.precision();
var b = Float.precision();

var c = a* b
严重性:一般。

判定状况:高,在某些状况很困难。
解决方法:产生的结果为浮点数值0.0

常数参考错误(constant reference error)

说明:所参考的浮点数实字为not a number。

如何发生:程序试着存取一个浮点数实字但组译器产生了not a number的浮点数常数。
范例:参考浮点数常数。

严重性:一般。
判定状况:高

解决方法:这会产生invalid值。

说明:参考的浮点数实字不是正无穷大就是负无穷大的浮点数常数。
如何发生:程序试着存取一个浮点数实字但组译器产生了正无穷大或负无穷大的浮点数常数。

范例:参考浮点数常数。
严重性:一般。

判定状况:高
解决方法:这会产生invalid值。

说明:需要参照浮点数值所发生的错误。

如何发生:程序需要使用浮点数值但环境值支持整数值。
范例:var a = 3.14;

严重性:一般
判定状况:高

解决方法:这会产生invalid值。

转换错误

这个错误的发生同WML Script所支持的自动转换有关。

说明:欲转换成整数值,但这个值超过整数所能接受的范围(正或负)。
如何发生:程序试着自动转换成整数时。

范例: var a = -"99999999999999999999999999999999999999999";
严重性:一般

判定状况:高
解决方法:这会产生invalid值。

说明:欲转换成浮点数,但这个值小于浮点数所能接受的范围(正或负)。
如何发生:程序时值自动转换成浮点数时。

范例:var a = -"99999999999999999999999999999999999999999";
严重性:一般

判定状况:高
解决方法:这会产生invalid值。

说明:欲转换成浮点数,但这个值小于浮点数所能接受的范围(正或负)。

如何发生:程序时值自动转换成浮点数时。
范例:var a = -"99999999999999999999999999999999999999999";

严重性:一般
判定状况:高

解决方法:这会产生浮点数0.0。

from:asp学习网/title:WML Script1.1简介/ time:2007-1-21 2:02:19

本文主题WMLScript简介

asp教程 ©2006-2007 aspxuexi.com | 关于站点 | 版权隐私 | 站内搜索
复制或者翻版 请于夜间进行