JavaScript 网页编程从入门到精通 (清华社"视频大讲堂"大系·网络开发视频大讲堂)
上QQ阅读APP看书,第一时间看更新

6.8 with语句

with语句能够临时改变变量的作用域。具体用法如下:

      with (object)
        statement

参数object表示一个对象,它临时定义了with结构体内所有变量的作用域,当执行完with结构之后,又恢复变量的原始状态。

with关键字后面必须跟随一个由小括号包含的对象,而不是条件表达式。这个对象能够临时划定一个范围,指定with结构体内的变量都以它作为逻辑域。

【示例1】对于下面语句:

      n = Math.cos(1) + Math.sin(1);

可以把它转换为with结构来表示:

      with(Math)
          n = cos(1) + sin(1);

cos和sin变量的作用域就临时发生了变化,但是JavaScript能够根据with关键字后面的对象知道这些变量的原始作用域,知道这些变量所定义的属性是属于哪个对象的,所以也会正确执行它们。

with语句可以访问特定对象的属性,但是不能用来给对象添加属性。如果要给对象创建新的属性,必须明确引用该对象。

【示例2】在实际开发中,可以把它作为代码简写的一种方法,特别是在作用域链很长时,使用with语句能够很明显地提高开发速度。

      <input type="text" />
      <input type="text" />
      <input type="text" />
      <script language="javascript" type="text/javascript">
      document.getElementsByTagName("input")[0].value = 0;
      document.getElementsByTagName("input")[1].value = 1;
      document.getElementsByTagName("input")[2].value = 2;
      </script>

上面脚本简写为:

      with(o=document.getElementsByTagName("input")){
          o[0].value = 0;
          o[1].value = 1;
          o[2].value = 3;
      }

在上面示例的with结构中,变量o表示一个头部域对象集合,它指向document.getElementsBy TagName("input"),当JavaScript需要解析这些变量时,会根据with语句临时指定的作用域头部所代表的对象属性检索这些被简化的变量,如果没有找到,才会到局部作用域,甚至是全局域中寻找它们的值。

with语句能够提高输入速度,但是却不能够提高JavaScript执行速度,同时这种写法也不利于代码优化,于是就有很多人反对这种用法。当然,这就是仁者见仁、智者见智,就看你的需要了。

【示例3】考虑到with结构破坏变量的作用域,不推荐使用。如果想简化代码编写,建议使用下面的方法:

      var o = document.getElementsByTagName("input");
      o[0].value = 0;
      o[1].value = 1;
      o[2].value = 3;