var obj= {
a:1,
b:this.a
};
alert(obj.b);
输出:undefined这里this指向window:
var a = 0
var obj= {
a:1,
b:this.a
};
alert(obj.b);
输出为0。但如果将b属性定义为一个方法则没问题:
var obj= {
a:1,
b:function(){return this.a;}
};
alert(obj.b());
输出1,this指向obj。这是为何?

解决方案 »

  1.   

    哎,为这个this快气疯了。
    真想不通那些js高手怎能用js开发游戏的。
      

  2.   

    晕了
    这里this指向window:
    var a = 0
    var obj= {
    a:1,
    b:this.a
    };
    alert(obj.b);
    输出为0。是因为你定义了a 跟this不this的没任何关系~~~
    a:1没任何意义~~~ 你没有定义a,当然报undefined了
    var a = 0
    var obj= {
    b:this.a
    };
    alert(obj.b);
    你试试看~~
      

  3.   

    我的第二个例子是说明第一个例子中this指向了window。如果不在全局定义a则报undefined,而不是自己理解的obj!
      

  4.   

    javascript的变量作用域用 function(){}来划分。
    而其他语言的变量作用域用 大括号{}来划分。
    你那个this,是在全局下的,那就是window。
      

  5.   


    var a = 0
    var obj= {
    a:1,
    b:this.a
    };
    alert(obj.b);
    //输出为0这个例子有错吧,输出的是undefined
    function fn(){
       alert(this.a);
    }有两种情况
    1,new fn();//this指向函数本身
    2,fn();//this指向相对于当前作用域的父级作用域,所以在这里是window;
    如果以下情况a = "123";
    function fn(){
        this.a = "111"
        function fn1(){
            alert(this.a);
        }
        fn1(); //这时候this指向的是fn这个作用域中的a,而并不是window下的a
    }
      

  6.   

    类的定义有好多种方式,现在比较流行的也是楼主这类的轻量级的定义方式。
    楼主这样定义类,在给类属性赋值时,必须那个属性有个实际值,比如属性a的实际值是1,b的实际值是this.b。这就出现了问题,我当前有没有使用obj对象,我的this关键字也不能指向自己的对象实例啊,但是我得给b属性赋值啊,怎么办,this就会去搜索作用域,最后发现window对象可以用,然后就指向它了。
    然后就是b:function(){return this.a;}这样为什么可以,因为给b属性赋值的是一个function对象,这个function只是定义了,然后赋给b但并未执行。当调用b时,this发现,我是在obj对象实例下调用的b方法,然后它就乖乖的指向obj对象了
    不知道这样说是不是可以通俗易懂些?
      

  7.   

    [Quote=引用 10 楼 liangws 的回复:]JScript codevar a = 0
    var obj= {
    a:1,
    b:this.a
    };
    alert(obj.b);
    //输出为0
    没错,是输出0,在ie和ff下都是报0
      

  8.   

    那为什么同是obj对象,方法中的this能准确指向obj,而属性则指向window?
      

  9.   

    代表当前对象 例如 input select等控件的 实例! 等效使用!
      

  10.   


    this是指向函数的调用者(call/apply方法除外)。
    在全局下,调用者就是window。

    var obj = {a:this.b};
    实际上是将this.b赋值给obj的a属性。而这个时候的this是window。
    var obj = {a:function(){this.b}}
    是将function赋值给obj的a属性,然后 obj.a();的时候,调用者就是obj,所以this就是obj。
      

  11.   

    呵呵 楼主js新手吧。this 这个东西是为了方便访问调用当前函数的对象而存在的。  新人可以这么理解。你的代码没有在函数里面 那么他的this就是window
    全局下面的 var定义的东西实际上是window下面的属性  function fun (){}这种定义的函数我们调用他 那么他里面的this也是window 当然 我们可以改变这个this的只  我们有call 和apply    
      

  12.   

    this 这个东西是为了方便访问调用当前函数的对象而存在的this是指向函数的调用者(call/apply方法除外)。在全局下,调用者就是window。

    var obj = {a:this.b};
    实际上是将this.b赋值给obj的a属性。而这个时候的this是window。
    var obj = {a:function(){this.b}}
    是将function赋值给obj的a属性,然后 obj.a();的时候,调用者就是obj,所以this就是obj。
    类的定义有好多种方式,现在比较流行的也是楼主这类的轻量级的定义方式。
    楼主这样定义类,在给类属性赋值时,必须那个属性有个实际值,比如属性a的实际值是1,b的实际值是this.b。这就出现了问题,我当前有没有使用obj对象,我的this关键字也不能指向自己的对象实例啊,但是我得给b属性赋值啊,怎么办,this就会去搜索作用域,最后发现window对象可以用,然后就指向它了。
    然后就是b:function(){return this.a;}这样为什么可以,因为给b属性赋值的是一个function对象,这个function只是定义了,然后赋给b但并未执行。当调用b时,this发现,我是在obj对象实例下调用的b方法,然后它就乖乖的指向obj对象了
    学习了