从书上看到作用域内的this指向作用域的调用对象,但是下面这个情况让我很不解
var x1=7;
var t={
x1:2,
x2:{x3:this.x1}
};
alert(t.x2.x3);//为什么这里输出7,按理说调用x2的是t啊,本以为this应该指向t,但是事实上this指向了windowvar y={
x1:2,
x2:function(){return this.x1}
};
alert(y.x2());//这里输出2我知道原因,是因为调用x2的对象是y所以this指向y另外:
var a=6;
function A(){
        var a=8;
function B(){
alert(this.a);//为啥这里输出6,按理说调用B()的是A()作用域的call Object吧,该输出8啊!完全晕了..........
}
B();
alert(this.a);
}
A();

解决方案 »

  1.   

    alert(t.x2.x3);//为什么这里输出7,按理说调用x2的是t啊,本以为this应该指向t,但是事实上this指向了window
    因为t不是OBJECT,只是一个JSON数据格式
      

  2.   

    你的“另外里的问题是变量定义的作用域问题,你把
    function A(){
            var a=8;----->变成 a=8 ,看看什么结果?呵呵最上面的a=6是全局变量,下面的 var a=8是局部变量定义,因此虽然同名但“以全局为重”
    所以ALERT出来6;变成a=8就意味着重新定义全局变量a=8了,所以ALERT出来8;
      

  3.   

    先谢谢你的回答!不过:
    var y={
    x1:2,
    x2:function(){return this.x1}
    };
    alert(y.x2());//这里输出2我知道原因,是因为调用x2的对象是y所以this指向y
    为什么function回把JOSN格式当做调用对象
      

  4.   

    4楼:因为x2所定义包含的数据就是对象function,不是普通的文字或数字
      

  5.   

    "从书上看到作用域内的this指向作用域的调用对象,但是下面这个情况让我很不解"因为
    var t={ ...  this }this不是function里面----------------------
    为什么默认this是window对象~~你也可以这样看~~function Window(){
        //core inti....
        //....
        //....    //user code start
        var x1=7;
        var t={
            x1:2,
            x2:{x3:this.x1}
        };
    }
    window=new Window();只是打个比方~~
      

  6.   

    还是谢谢你的回答,其实嵌套函数的作用域我明白,但是嵌套关系里又this我就不明白了,不过我还是想问function里面的this到底指向了什么
    例如:
    var y={ 
    x1:2, 
    x2:function(){return this.x1} 
    }; 
    this指向y(看到大多数人说是因为this指向调用对象,所以指向y,再加上你刚才的回答就说明JSON数据格式可以做函数的调用对象)
    但是请看这里:
    var a=6;
    function A(){
            var a=8;
        function B(){
            alert(this.a);//为啥这里输出6,按理说调用B()的是A()作用域的call Object吧,该输出8啊!完全晕了..........
        }
        B();
        alert(this.a);
    }
    A();
    this指向了全局调用对象window,既然function也是一种对象,为什么this不指向A,我看到犀牛书说过:一个函数在调用的时候回先在当前作用域内建立一个调用对象(call  Object),这里相对于B()CALL OBJECT也就是A(),那么按道理说B()内的this该指向FUNCTION A但是事实上他输出的是全局作用域的var a=6,说明指向了全局作用域,这就是我就不明白的地方
      

  7.   

    var a=6;
    function A(){
            var a=8;
        function B(){
            alert(this.a);//为啥这里输出6,按理说调用B()的是A()作用域的call Object吧,该输出8啊!完全晕了..........这里你理解错误了
        }
        B();//你这里调用只是B函数,这里的this指的是window,那么this.a调用的是window的对象,即是全局对象
        alert(this.a);
    }
    A();
      

  8.   

    var y={
    x1:2,
    x2:function(){return this.x1}
    };
    alert(y.x2());//这里输出2我知道原因,是因为调用x2的对象是y所以this指向y,但是你知道为什么指向y吗?
      

  9.   

    x2:function(){return this.x1} 

    x2:{x3:this.x1}
    你看出区别来没?明白这2个的区别,你也就明白了为什么指向不同一点点指点给你,让你自己领会,你理解就会更进一层
      

  10.   

    我也说下:其实私有和共有属性,简单的可以理解为函数内和函数外(函数内私有,外公有)
    作用域大致为两个:语法作用域和函数作用域
    this:是指向作用域的调用对象,所以前提是形成了作用域。
    所以对于第一段代码var x1=7;
    var t={
    x1:2,
    x2:{x3:this.x1}
    };
    alert(t.x2.x3);//因为这里的this没包含在语法或函数里,没有作用域,所以它指向到最外的window对象。
    第二段代码和一正好对比
    var y={
    x1:2,
    x2:function(){return this.x1}
    };
    alert(y.x2());//这里因为this在函数里形成了作用域,所以this指向了调用作用域的对象y,y.x1 = 2.var a=6;
    function A(){
            var a=8;
        function B(){
            alert(this.a);//这里不存在A调用B的关系,A和B是同级嵌套关系,this存在B的作用域里,如果不存在就溢出到外面的window了
        }
        B();
        alert(this.a);
    }
    A();这是我自己的想法。。不知道对错
      

  11.   

    意思就是说JS的作用域范围是函数级的?var x1=2;var x={x1:1,x2:{x3:this.x1,x4:{x5:this.x1}}};alert(x.x2.x3+" "+x.x2.x4.x5);都输出windows作用域下的x1
    var x1=2;var t=function(){var x1=9;var x={x1:1,x2:{x3:this.x1,x4:{x5:this.x1}}};alert(x.x2.x3+" "+x.x2.x4.x5);};
    t();因为this指向函数的调用对象也就是windows所以还是2,是这样嘛?
      

  12.   

    this是指向调用该方法的对象(跟你那个的意思差不多)
    方法,作用域,闭包是通过function实现的
    没有function就不用说那些东西了至于这里
        function B(){ 
            alert(this.a);//为啥这里输出6,按理说调用B()的是A()作用域的call Object吧,该输出8啊!完全晕了.......... 
        } 
        B(); 
    关键就是弄清楚到底是什么调用了b
    那就要明白什么才是调用
    例如
    a.b()
    这样我们就说a调用了b
    那对于lz那个情况是
    function a(){
        b();
    }
    a();
    应该说a中执行了一个方法b
    可以说两者完全不同
    那到底是什么调用了b
    js中如果没有显式注明,那么默认会用window来调用
    实际上是
    function a(){
        window.b();
    }
    a();
      

  13.   

    漏了说
    用with的时候就不一定要a.b()这个形式了