本帖最后由 moliu 于 2009-10-29 09:47:05 编辑

解决方案 »

  1.   

    应该是作用域的问题!!!不知道该怎么说~~~~
    function x(){alert(v)}; 函数内部的v,调用的是全局变量的v
    但是x=function x(){alert(v)}; 这种形式的时候,就像在with内部进行赋值表达式一样,用的v就是with对象的v了~~~
      

  2.   

    第一个:
      x()内部的调用的v为全局变量v,所以值为10
    第二个:
      x()内部形成一个闭包,所以v并不在obj下,js编译器会往上查找,即window对象,故:
      function x(){alert(window.v)}; window.v即全局变量v,所以值为10
    第三个
      代码可变相为
    obj.x=function x(){alert(this.v)} //this.v实际上就是obj.v
    obj.x();这样就明白为什么是2了纯属个人理解,不准期之处请高人指点!
      

  3.   

    这是IE的一个BUG.
    with并不会改变this指针指向.
    this还是指向window的
    但是在with中的所有变量会默认加上obj前缀
    例如:
    with(obj) 

        x=function x(){alert(v)}; 
        x(); //输出 2 

    等价于
    obj.x=function x(){alert(obj.v)};
    obj.x();
    而前面的
    var v=10; 
    var obj={v:2}; with(obj) 

        function x(){alert(v)}; 
        x(); //输出 10,为什么 

    实际为
    obj.x = function(){alert(obj.v)};
    obj.x();
    但IE的bug把其误判为
    obj.x = function(){alert(v)};
    obj.x();
      

  4.   

    由于var function会预定义
    ie把他们自动提前了
    第二个实际上是这样的效果
    function x(){alert(v)}; 
    with(obj) 

        x(); //输出 10,为什么 

    但这其实不太合理
    因为根据静态作用域的定义作用域应该是根据被定义的位置的那应该包含了obj才对
    这个ff就比较正确
      

  5.   

    var v=10; 
    var obj={v:2}; with(obj) 

        function x(){alert(v)}; 
        x(); //在 firefox 下输出 2,我刚试过 
    } 谈笑有鸿儒
    往来无白丁
      

  6.   

    第三个比较复杂
    在ie中是这样的 
    function x(){alert(v)};
    with(obj) 

        x=function (){alert(v)}; 
        x(); //输出 2 
    } ff中这样的
    with(obj) 

        x=function (){alert(v)}; 
        x(); //输出 2 
    } 具体参考
    http://hax.javaeye.com/blog/230182
      

  7.   


    ff就是按照根据静态作用域的定义作用域
    所以包括了obj
    只是ie有问题
      

  8.   

    搞着搞着我也迷惑了.
    刚刚继续测试的时候发现.
    如果with(obj)时
    obj本身没有那个属性x
    则不会使用默认对象
    也就是不会将x化作obj.x