JAVA认证:编写高级JavaScript代码
来源:优易学  2011-9-12 11:13:16   【优易学:中国教育考试门户网】   资料下载   IT书店

 

  3.变量范围
  JScript 有两种变量范围:全局和局部。如果在任何函数定义之外声明了一个变量,则该变量为全局变量,且该变量的值在整个持续范围内都可以访问和修改。如果在函数定义内声明了一个变量,则该变量为局部变量。每次执行该函数时都会创建和破坏该变量;且它不能被该函数外的任何事物访问。
  像 C++ 这样的语言也有“块范围”。在这里,任何一对“{}”都定义新的范围。JScript 不支持块范围。
  一个局部变量的名称可以与某个全局变量的名称相同,但这是完全不同和独立的两个变量。因此,更改一个变量的值不会影响另一个变量的值。在声明局部变量的函数内,只有该局部变量有意义。
  var aCentaur = "a horse with rider,"; // aCentaur 的全局定义。
  // JScript 代码,为简洁起见有省略。
  function antiquities() // 在这个函数中声明了一个局部 aCentaur 变量。
  {
  // JScript 代码,为简洁起见有省略。
  var aCentaur = "A centaur is probably a mounted Scythian warrior";
  // JScript 代码,为简洁起见有省略。
  aCentaur += ", misreported; that is, "; // 添加到局部变量。
  // JScript 代码,为简洁起见有省略。
  } // 函数结束。
  var nothinginparticular = antiquities();
  aCentaur += " as seen from a distance by a naive innocent.";
  /*
  在函数内,该变量的值为 "A centaur is probably a mounted Scythian warrior,
  misreported; that is, ";在函数外,该变量的值为这句话的其余部分:
  "a horse with rider, as seen from a distance by a naive innocent."
  */
  很重要的一点是注意变量是否是在其所属范围的开始处声明的。有时这会导致意想不到的情况。
  tweak();
  var aNumber = 100;
  function tweak() {
  var newThing = 0; // 显式声明 newThing 变量。
  // 本语句将未定义的变量赋给 newThing,因为已有名为 aNumber 的局部变量。
  newThing = aNumber;
  //下一条语句将值 42 赋给局部的 aNumber。aNumber = 42;
  if (false) {
  var aNumber; // 该语句永远不会执行。
  aNumber = 123; // 该语句永远不会执行。
  } // 条件语句结束。
  } // 该函数定义结束。
  当 JScript 运行函数时,首先查找所有的变量声明,
  var someVariable;
  并以未定义的初始值创建变量。如果变量被声明时有值,
  var someVariable = "something";
  那么该变量仍以未定义的值初始化,并且只有在运行了声明行时才被声明值取代,假如曾经被声明过。
  JScript 在运行代码前处理变量声明,所以声明是位于一个条件块中还是其他某些结构中无关紧要。JScript 找到所有的变量后立即运行函数中的代码。如果变量是在函数中显式声明的 ? 也就是说,如果它出现于赋值表达式的左边但没有用 var 声明 ? 那么将把它创建为全局变量。
  复制、传递和比较数据
  在 JScript 中,对数据的处理取决于该数据的类型。
  按值和按引用的比较
  Numbers 和 Boolean 类型的值 (true 和 false) 是按值来复制、传递和比较的。当按值复制或传递时,将在计算机内存中分配一块空间并将原值复制到其中。然后,即使更改原来的值,也不会影响所复制的值(反过来也一样),因为这两个值是独立的实体。
  对象、数组以及函数是按引用来复制、传递和比较的。当按地址复制或传递时,实际是创建一个指向原始项的指针,然后就像拷贝一样来使用该指针。如果随后更改原始项,则将同时更改原始项和复制项(反过来也一样)。实际上只有一个实体;“复本”并不是一个真正的复本,而只是该数据的又一个引用。
  当按引用比较时,要想比较成功,两个变量必须参照完全相同的实体。例如,两个不同的 Array 对象即使包含相同的元素也将比较为不相等。要想比较成功,其中一个变量必须为另一个的参考。要想检查两个数组是否包含了相同的元素,比较 toString() 方法的结果。
  最后,字符串是按引用复制和传递的,但是是按值来比较的。请注意,假如有两个 String 对象(用 new String("something") 创建的),按引用比较它们,但是,如果其中一个或者两者都是字符串值的话,按值比较它们。
  注意 鉴于 ASCII和 ANSI 字符集的构造方法,按序列顺序大写字母位于小写字母的前面。例如 "Zoo" 小于 "aardvark"。如果想执行不区分大小写的匹配,可以对两个字符串调用 toUpperCase() 或 toLowerCase()。
  传递参数给函数
  按值传递一个参数给函数就是制作该参数的一个独立复本,即一个只存在于该函数内的复本。即使按引用传递对象和数组时,如果直接在函数中用新值覆盖原先的值,在函数外并不反映新值。只有在对象的属性或者数组的元素改变时,在函数外才可以看出。
  例如(使用 IE 对象模式):
  // 本代码段破坏(覆盖)其参数,所以
  // 调用代码中反映不出变化。
  function Clobber(param)
  {
  // 破坏参数;在调用代码中
  // 看不到。
  param = new Object();
  param.message = "This will not work";
  }
  // 本段代码改变参数的属性,
  // 在调用代码中可看到属性改变。
  function Update(param)
  {
  // 改变对象的属性;
  // 可从调用代码中看到改变。
  param.message = "I was changed";
  }
  // 创建一个对象,并赋给一个属性。
  var obj = new Object();
  obj.message = "This is the original";
  // 调用 Clobber,并输出 obj.message。注意,它没有发生变化。
  Clobber(obj);
  window.alert(obj.message); // 仍然显示 "This is the original"。
  // 调用 Update,并输出 obj.message。注意,它已经被改变了。
  Update(obj);
  window.alert(obj.message); // 显示 "I was changed"。
  检验数据
  当按值进行检验时,是比较两个截然不同的项以查看它们是否相等。通常,该比较是逐字节进行的。当按引用进行检验时,是看这两项是否是指向同一个原始项的指针。如果是,则比较结果是相等;如果不是,即使它们每个字节都包含完全一样的值,比较结果也为不相等。
  按引用复制和传递字符串能节约内存;但是由于在字符串被创建后不能进行更改,因此可以按值进行比较。这样可以检查两个字符串是否包含相同的内容,即使它们是完全独立产生的。

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训