Microsoft(R) JScript(R)
控制程序的流程
 JScript 教程
上一页
下一页


为什么要控制执行流程?
经常需要脚本在不同的条件下完成不同的事情。例如,您可以编写一个每小时检查时间的脚本,并在这一天中适当地更改某些参数。您也可以编写一个可以接收某种输入并采取相应操作的脚本。或者可以编写一个重复指定操作的脚本。

您可以测试若干种条件。Microsoft JScript 中所有的条件测试结果都是 Boolean 值,因此任何测试的结果是 truefalse。您可以自由地测试 Boolean 类型、数值类型或字符串类型的值。

JScript 提供了用于各种可能性的控制结构。最简单的控制结构是条件语句。

使用条件语句
JScript 支持 ifif...else 条件语句。在 if 语句中将测试一个条件,如果该条件满足测试,就将执行所编写的 JScript 编码。(在 if...else 语句中,如果条件不满足测试,则将执行不同的代码。)最简单的 if 语句格式可以在一行中写完,不过更常见的是多行的 ifif...else 语句。

下述示例演示了使用 ifif...else 语句的各种可能的语法。第一个示例演示了最简单的 Boolean 测试。当(且仅当)括号之间的项的值为 true 时,if 后续的语句或语句块才会被执行。

// smash() 函数是在该代码的其他地方定义的。
if (newShip)
   smash(champagneBottle,bow);  // Boolean 测试,看 newShip 是否为真。

// 在本示例中,除非两个条件都为真,否则该测试将不会被满足。
if (rind.color == "deep yellow " && rind.texture == "large and small wrinkles")
{
        theResponse = ("Is it a Crenshaw melon? <br> ");
}

// 在本示例中,只要任何一个条件为真,则测试即会满足。
var theReaction = "";
if ((lbsWeight > 15) || (lbsWeight > 45))
{
    theReaction = ("Oh, what a cute kitty! <br>");
}
else
    theReaction = ("That's one huge cat you've got there! <br>");
条件运算符
JScript 也支持隐式的条件格式。该格式在要测试的条件后使用一个问号(而不是在条件前的 if ),并指定两个可选项,一个在满足条件时使用,另一个在条件不满足时使用。两个选择项之间用一个冒号隔开。
var hours = "";

// 下面的代码指定 hours 是包含 theHour 的内容,
// 还是包含 theHour - 12 的内容。

hours += (theHour >= 12) ? " PM" : " AM";



提示   如果要一起测试多个条件,并且知道某个条件比其他条件更可能满足或不满足测试,(根据这些测试是用 OR (||) 还是 AND (&&) 连接的,可以通过将该条件放在条件语句的最前面来加速脚本的执行。例如,如果三个条件都必须为真(使用 && 运算符),并且第二个测试失败,则第三个条件不会被测试。

类似地,如果多个条件中只要有一个为真(使用 || 运算符),则当任何一个条件满足该测试时测试则停止。如果要测试的条件包括函数调用或其他代码,这种处理方式就特别有效。

快速判别的副作用的一个示例是:在下例中如果 runfirst() 返回 0 或 false, 则 runsecond 不会被执行。

if ((runfirst() == 0) || (runsecond() == 0))
// 若干代码  

使用重复或循环
有多种方式来重复执行一条语句或语句块。通常重复执行被称为 循环。 典型情况是用某个变量测试来进行控制,每执行一次循环变量的取值都会更改。 Microsoft JScript 支持很多种循环: for 循环、 for...in 循环、 while 循环、 do...while 循环和 switch 循环。
使用 for 循环
for 语句指定了一个计数器变量,一个测试条件,以及更新该计数器的操作。在每次执行循环之前(这称为一遍循环或一次重复),都将测试该条件。在执行该循环后,计算机变量将在下一次循环之前被更新。

如果循环条件永不会满足,则根本不会执行该循环。如果测试条件始终满足,则将导致无限循环。在有些情况下,前者可能是合乎需要的,而后者几乎没有用处,因此在编写循环条件时一定要小心。

/*
更新表达式 (下例中的 "icount++")将在循环结束时被执行,即在构成循环主体的语句块被执行后,在测试条件之前。
*/

var howFar = 11;  // 将循环次数限制为 11。

var sum = new Array(howFar);  // 创建一个称为 sum 并具有 11 个成员的数组,这 11 个成员从 0 到 10。
var theSum = 0;
sum[0] = 0;

for(var icount = 1; icount < howFar; icount++)  {        // 在本例中将从 1 到 10 进行计数。
theSum += icount;
sum[icount] = theSum;
}

var newSum = 0;
for(var icount = 1; icount > howFar; icount++)  {        // 该循环根本不会被执行。
newSum += icount;
}

var sum = 0;
for(var icount = 1; icount > 0; icount++)  {        // 这是一个无限循环。
sum += icount;
}
使用 for...in 循环
JScript 提供了一种特别的循环方式来遍历一个对象的所有属性。 for...in 循环中的循环计数器将遍历数组中的所有索引。它是一个字符串,而不是数字。
for (j in tagliatelleVerde)  // tagliatelleVerde 是一个有多个属性的对象
{
// 各种 JScript 代码语句。
}
使用 while 循环
while 循环与 for 循环非常相似。其不同之处是 while 循环没有内置的计数器或更新表达式。如果已经有由变量赋值反映的变化条件,并且希望使用该条件来控制语句或语句块的循环执行,就可以使用while 循环。
var theMoments = "";
var theCount = 42;        // 初始化计数器变量。
while (theCount >= 1)  {
    if (theCount > 1)  {
        theMoments = "Only " + theCount + " moments left!";
}
    else  {
        theMoments = "Only one moment left!";
    }
theCount--;        // 更新计数器变量。
}
theMoments = "BLASTOFF!";



注意  由于 while 循环没有显式的内置计数器变量,因此比其他类型更容易产生无限循环。此外,部分原因是不易发现循环条件是在何时何地被更新的,因此很容易编写了一个实际上从不更新条件的 while 循环。在编写 while 循环时应特别小心。


使用 breakcontinue 语句
Microsoft JScript 提供了一个语句来停止执行循环。break 语句可以用来在某些(特别)条件被满足时停止执行循环。continue 语句可以用来立即跳至下一次循环,即跳过余下的代码块并更新计数器变量,如 forfor...in 循环一样。
var theComment = "";
var theRemainder = 0;
var theEscape = 3;
var checkMe = 27;
for (kcount = 1; kcount <= 10; kcount++) 
{
    theRemainder = checkMe % kcount;
    if (theRemainder == theEscape)
      {
            break;  // 第一次遇到 remainder 等于 escape 时就从循环退出。
}
theComment = checkMe + " divided by " + kcount + " leaves a remainder of  " + theRemainder;
}

for (kcount = 1; kcount <= 10; kcount++) 
{
   theRemainder = checkMe % kcount;
   if (theRemainder != theEscape) 

   {
      continue;  // 只选择那些等于 escape 的 remainders,忽略其它。
}
// 使用选中的 remainders 的 JScript 代码。
}

var theMoments = "";
var theCount = 42;  // 初始化计数器。
while (theCount >= 1)  {
// if (theCount < 10)  {  // 警告!
// 这里使用 continue 将导致一个无限循环!。
// continue;
// }
    if (theCount > 1)  {
        theMoments = "Only " + theCount + " moments left!";
}
    else  {
        theMoments = "Only one moment left!";
    }
theCount--;  // 更新计数器。
}
theCount = "BLASTOFF!";