首页 JScript 高级教程(1)

JScript 高级教程(1)

举报
开通vip

JScript 高级教程(1)递归是一种重要的编程技术。该方法用于让一个函数从其内部调用其自身。一个信手可得的示例就是计算阶乘。0和1的阶乘都被特别地定义为1。更大数的阶乘是通过计算1*2*...来求得的,每次增加1,直至达到要计算其阶乘的那个数。下面的段落是用文字定义的计算阶乘的一个函数。“如果这个数小于零,则拒绝接收。如果不是一个整数,则将其向下舍入为相邻的整数。如果这个数为0或1,则其阶乘为1。如果这个数大于1,则将其与相邻较小的数的阶乘相乘。”要计算任何大于1的数的阶乘,至少需要计算一个其他数的阶乘。用来实现这个功能的函数就是已经位于其...

JScript 高级教程(1)
递归是一种重要的编程技术。该方法用于让一个函数从其内部调用其自身。一个信手可得的示例就是计算阶乘。0和1的阶乘都被特别地定义为1。更大数的阶乘是通过计算1*2*...来求得的,每次增加1,直至达到要计算其阶乘的那个数。下面的段落是用文字定义的计算阶乘的一个函数。“如果这个数小于零,则拒绝接收。如果不是一个整数,则将其向下舍入为相邻的整数。如果这个数为0或1,则其阶乘为1。如果这个数大于1,则将其与相邻较小的数的阶乘相乘。”要计算任何大于1的数的阶乘,至少需要计算一个其他数的阶乘。用来实现这个功能的函数就是已经位于其中的函数;该函数在执行当前的这个数之前,必须调用它本身来计算相邻的较小数的阶乘。这就是一个递归示例。显然,这样有可能会出现问题。可以很容易地创建一个递归函数,但该函数不能得到一个确定的结果,并且不能达到一个终点。这样的递归将导致计算机执行一个“无限”循环。下面就是一个示例:在计算阶乘的文字描述中遗漏了第一条规则(对负数的处理),并试图计算任何负数的阶乘。这将导致失败,因为按顺序计算-24的阶乘时,首先不得不计算-25的阶乘;然而这样又不得不计算-26的阶乘;如此继续。很明显,这样永远也不会到达一个终止点。因此在设计递归函数时应特别仔细。如果怀疑其中存在着无限递归的可能,则可以让该函数 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 它调用自身的次数。如果该函数调用自身的次数太多,即使您已决定了它应调用多少次,就自动退出。下面仍然是阶乘函数,这次是用JScript代码编写的。functionfactorial(aNumber) {aNumber=Math.floor(aNumber); //如果这个数不是一个整数,则向下舍入。if(aNumber<0) { //如果这个数小于0,拒绝接收。return"notadefinedquantity";}if((anumber==0)||(anumber==1)) { //如果为0或1,则其阶乘为1。return1;}elsereturn(anumber*factorial(anumber-1)); //否则,递归直至完成。}变量范围MicrosoftJScript有两种变量范围:全局和局部。如果在任何函数定义之外声明了一个变量,则该变量为全局变量,且该变量的值在整个持续范围内都可以访问和修改。如果在函数定义内声明了一个变量,则该变量为局部变量。每次执行该函数时都会创建和破坏该变量;且它不能被该函数外的任何事物访问。一个局部变量的名称可以与某个全局变量的名称相同,但这是完全不同和独立的两个变量。因此,更改一个变量的值不会影响另一个变量的值。在声明局部变量的函数内,只有该局部变量有意义。varaCentaur="ahorsewithrider,"; //aCentaur的全局定义。//JScript代码,为简洁起见有省略。functionantiquities() //在这个函数中声明了一个局部aCentaur变量。{//JScript代码,为简洁起见有省略。varaCentaur="AcentaurisprobablyamountedScythianwarrior";//JScript代码,为简洁起见有省略。aCentaur=",misreported;thatis,"; //添加到局部变量。//JScript代码,为简洁起见有省略。} //函数结束。varnothinginparticular=antiquities();aCentaur="asseenfromadistancebyanaiveinnocent.";/*在函数内,该变量的值为"AcentaurisprobablyamountedScythianwarrior,misreported;thatis,";在函数外,该变量的值为这句话的其余部分:"ahorsewithrider,asseenfromadistancebyanaiveinnocent."*/ 很重要的一点是注意变量是否是在其所属范围的开始处声明的。有时这会导致意想不到的情况。varaNumber=100;varwithAdditive=0;withAdditive=aNumber; //withAdditive现在是100。tweak();withAdditive=aNumber; //withAdditive现在是200。functiontweak() {varnewThing=0; //显示声明newThing变量。//如果不注释下一条语句,将产生一个错误。//newThing=aNumber;//下一条语句将值42赋给局部的aNumber,该变量是隐式声明的。aNumber=42;if(false) {varaNumber; //该语句永远不会执行。aNumber="Hello!"; // 该语句永远不会执行。} //条件语句结束。} //该函数定义结束。被注释掉的语句试图将局部变量aNumber的值赋给局部变量newThing的值。尽管事实上在函数的其他地方定义了一个局部aNumber变量,并且因此在整个函数内都存在,这样做也不会成功。aNumber变量在代码中这条语句的位置处没有被赋值,因此是undefined。复制、传递和比较数据在MicrosoftJScript中,对数据的处理取决于该数据的类型。按值和按引用的比较Numbers和Boolean类型的值(true和false)是按值来复制、传递和比较的。当按值复制或传递时,将在计算机内存中分配一块空间并将原值复制到其中。然后,即使更改原来的值,也不会影响所复制的值(反过来也一样),因为这两个值是独立的实体。对象、数组以及函数在大多数环境中都是按引用来复制、传递和比较的。当按地址复制或传递时,实际是创建一个指向原始项的指针,然后就像拷贝一样来使用该指针。如果随后更改原始项,则将同时更改原始项和复制项(反过来也一样)。实际上只有一个实体;“复本”并不是一个真正的复本,而只是该数据的又一个引用。注意 可以更改对象和数组的该操作,方法是为其指定assign()方法。最后,字符串是按引用复制和传递的,但是是按值来比较的。注意 鉴于ASCII和ANSI字符集的构造方法,按序列顺序大写字母位于小写字母的前面。例如"Zoo"小于"aardvark"。传递参数给函数按值传递一个参数给函数就是制作该参数的一个独立复本,即一个只存在于该函数内的复本。另外,如果按引用传递一个参数,且该函数更改了该参数的值,则这个值在脚本的任何位置都会被改变。检验数据当按值进行检验时,是比较两个截然不同的项以查看它们是否相等。通常,该比较是逐字节进行的。当按引用进行检验时,是看这两项是否是指向同一个原始项的指针。如果是,则比较结果是相等;如果不是,即使它们每个字节都包含完全一样的值,比较结果也为不相等。按引用复制和传递字符串能节约内存;但是由于在字符串被创建后不能进行更改,因此可以按值进行比较。这样可以检查两个字符串是否包含相同的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 ,即使它们是完全独立产生的。使用数组数组下标JScript中的数组是稀疏的。也就是说,如果一个数组具有三个元素,编号分别为0、1和2,您就可以创建元素50,而不必担心从3到49的参数。如果该数组有一个自动的length变量,(请参阅固有对象了解有关数组长度的自动监控的说明),该length变量被设为51,而不是4。当然您可以创建各元素的编号之间没有间隙的数组,不过没有必要这样做。实际上在JScript中,数组根本没有编号的下标。在JScript中,对象和数组实质上是一样的。真正的差异不在于数据,而在于您引用数组的成员或对象的属性和方法的方式。数组寻址有两种方式来引用数组中的成员。一般说来,可以使用方括号来引用数组。方括号中是一个数字或一个值为非负整数的表达式。下面的示例假定在脚本的其他地方已定义了entryNum变量,且已赋值。theListing=addressBook[entryNum];theFirstLine=theListing[1];这种寻址方法与对象寻址的方法是等价的,不过在对象寻址中在圆点后必须使用实际的属性名。如果没有这样的属性,代码将产生一个错误。数组寻址的第二种方式是制作一个包含编号属性的对象/数组,然后用一个循环产生这些编号。下面的示例将产生两个数组:一个代表名字,一个代表地址,名字和地址均来自addressBook中的一个列表。每一项包含四个属性。例如,从theListing的[Name1]到[Name4]属性产生的theName实例可能包含"G.""Edward""Heatherington""IV",或"George""""Sand"""。theListing=addressBook[entryNum];for(i=1;i<4;i) {theName[i]=theListing["Name"i];theAddress[i]=theListing["Address"i];}虽然这个特定的实例很短,并且可以很容易地使用"."这种记法来表示(也就是按地址而不是按数组来对theListing、theName和theAddress寻址),但这并不总是可行的。有时特定的属性可能要在运行时才会存在,或者预先并不知道将是哪些项。例如,如果addressBook数组不是编好号码的清单,而是按姓排列的,用户可能在正在运行该脚本时“随意”输入名称来查找人员。下面的实例假定在脚本的其他地方已提供了适当的函数定义。
本文档为【JScript 高级教程(1)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_842972
暂无简介~
格式:doc
大小:27KB
软件:Word
页数:10
分类:
上传时间:2021-11-30
浏览量:1