转自:
http://bbs.xml.org.cn/dispbbs.asp?boardID=77&ID=59088
第五部分:WML Script脚本程序设计
作为一种编辑语言,WMLScript提供了强大的函数、语句和库功能,以及外部编辑、访问控制等支持,同时对程序运行中可能产生的错误给出了检测手段和具体的解决办法。这些内容属于WMLScript的脚本程序设计知识和进一步的编程规定,我们本章就对此进行详细介绍。
5.1 语句
前面我们学习了变量、操作符和表达式,但仅由这些内容并不能完成某个完整的功能,因为他们不能形成完整的操作或处理程序。变量就如同与严重的单词,表达式如语言中的词组,他们都不能表达一个完整的意思;只有语句,是语言中完整的句子,能够表达完整的意思并实现某个完整的功能。WML Script提供了丰富的语句功能,使用这些语句我们可以在WML的卡片中建立交互功能和其他需要的复杂功能。
在WML Script中,每条语句的后面都需要以一个分号(;)结尾。为了养成严谨的编程风格,建议大家编写脚本时,语句后一定要加上分号(;),这也有助于我们形成一种良好的编程习惯。
WML Script语句的书写和排列格式比较自由。我们可以在同一程序行中连续写上多个语句,也可以把同一语句分成多行排列。WML Script将根据分号(;)来确定语句的具体内容。
WML Script的语句主要包括两类。第一类是基本语句,如空语句、表达式语句、块语句、变量语句和return语句等;第二类是条件语句,如if语句;第三类是循环语句,如while语句、for语句、break语句和continue语句等。下面我们分别讲解这些语句的语法、功能和使用方法。
5.1.1 基本语句
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
};
5.1.2 条件语句
在条件语句中,当满足某种条件时 ,就会执行指定的一些代码,而在代码组另外某种条件时,则会执行另外一些代码。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...";
5.1.3 循环语句
使用循环语句可以反复执行某个代码块,直到循环结束条件满足后才停止执行。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中,而是开始下一轮的循环。