首页 > JavaScript > javascript with语句,小心使用
2009五月29

javascript with语句,小心使用

刚才已经解释过了javascript的变量作用域,现在我们可以来认真的了解一下with 语句的作用了。

我们已经知道,用变量的作用域和作用域链(即一个按顺序检索的对象列表)来进行变量名解析,

而with 语句就是用于暂修改作用域链的,其语法为:

with(object)
      statement


该语句可以有效地将object添加到作用域链的头部,然后执行statement,再把作用域链恢复到原始状态。

因为以前没有用过这个语句,所以看同事用的时候确实感觉不错。至少减少了不少输入,很适合我这种懒人

例如:

with(frames[1].document.forms[0]){
    //此处直接访问表单元素。例如:
    name.value      = '小小子';
    address.value   = 'http://www.xiaoxiaozi.com/';
    email.value     ='yufulong@gmail.com';
}

看,表单属性名前的前缀——frames[1].document.forms[0] 我就不用再写了。

这个对象不过是作用域链的一个临时部分,当JavaScript需要解析像 address这样的标识符时就会自动搜索它。

不过,书中的作者极力反对使用这个with 语句。嗯。

使用with语句的JavaScript代码很难优化,因此它的运算速度比不使用with语句的等价代码要得多。

而且,在with语句中的函数定义和变量初始化可能会产生令人惊讶的、相抵触的行为。(虽然作者没有举例,不过这话可够吓人的)。

因此我们避免使用with语句。

既然大师都这么说了,那么从此以后我也会尽量避免使用这个语句的。

可是 ,你会问那难道我真的每次都要写好长一段内容吗?比如上面的——frames[1].document.forms[0] 。。

唉,告诉你吧。有种东西叫变量。

例如上例完全可以改成这样:

var form = frames[1].document.forms[0];
form.name.value     = '小小子';
form.address.value  = 'http://www.xiaoxiaozi.com/';
form.email.value    = 'yufulong@gmail.com';

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/05/29/668/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

2 Responses to “javascript with语句,小心使用”

  1. #1 alswl 回复 | 引用 Post:2010-02-08 09:59

    嗯,JavaScript in Action也提到with语法要慎用

    [回复]

  2. #2 simaopig 回复 | 引用 Post:2010-02-08 10:01

    @alswl
    呵呵。好多国外牛人写的书都提到要慎用with。看来确实是有问题的。 :grin:

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)