代码如下所示:    var person={
name:'aaa'
    }
    with(person){
var name='bbb';
var age='27';
alert(name);//bbb
alert(age);//27
    }
    alert(name);//undefined
    alert(age);//27    with(location){
var href="ccc";
alert(href);//file://E:test.html
    }
    alert(href);//undefined
两个问题想请教:
1.关于with代码的作用域链顺序??
在with(person)中,我们alert(name)的结果是局部变量'bbb'而不是person.name的值'aaa'
在with(location)中,我们alert(href)的结果是location.href的值'file://E:/test.html'而不是局部变量'ccc'
这两个不一致啊,有矛盾啊!!???
2.关于with代码内部定义的变量,外部究竟能不能引用?
在with(person)中,我们定义了两个变量name和age,但是在with的外面,name不能使用,但是age却可以使用?
这两个也不一致啊?有矛盾啊???!!!

解决方案 »

  1.   

    with语句很特殊而且不被推荐使用,解析
     var person = {
         name: 'aaa'
     }
     with(person) {
         var name = 'bbb';//语句1
         var age = '27';//语句2,创建变量age
         alert(name === person.name);//true
     }
    内部创建的name指针指向了person.name,等价于:
     person.name = 'bbb';//语句1
     var age = '27';//语句2声明的name很其名的被当作person的属性处理,于是外部的name值为undefined;age与person无关联,变量被创建,出了with语句仍然使用。后半部分的href的赋值语句是有效的,浏览器环境下会跳转到后缀为"ccc"的超链接,等同于给location.href赋值,但同理只是修改了这个属性,外部herf未定义。鉴于with语句内部声明的奇怪逻辑及低下效率,你几乎看不到有人用。
      

  2.   

    你看下面的两个写法是不是一样的?
    var person =  new Object();
    person.name="jim";
    with(person) {
      var name = 'bbb';//语句1
      var age = '27';//语句2,创建变量age
      alert(name === person.name);//true
     }var person =  new Object();
    person.name="jim";
    (function(){
      var name = 'bbb';//语句1
      var age = '27';//语句2,创建变量age
      alert(name === person.name);//true
    }).apply(person,arguments);是不是样的?
      我认为是一样,对吗?
      

  3.   

    那再请问,您说var location='ccc'这个赋值语句是成功的了,那为什么我在这个语句后面alert(href)输出的内容不是'ccc',而是file://E:test.html呢?请指教,谢谢啦!
      

  4.   

    location 是不关键内部变量,不能用来随便用的,比如 location = "http://www.baidu.com";试试!
      

  5.   


    你直接使用语句
    location.href = "ccc";
    alert(location.href);效果是一样的,先跳出原本的location.href,然后跳转到/ccc页面
      

  6.   

    不是不推荐用with了吗?
    他的作用和call,apply类似,改变作用域!