this 指向的问题

(function(){
    var a = 11111;
    console.log(this.a);    

    var Test = function(a){
        this.a = a;
    }
    Test.prototype.geta=function(){
        console.log(this.a)
        console.log(this);
    }
    var test = new Test('a');
    test.geta();      

    var getaaa = test.geta;
    getaaa();    

})()

图片描述
getaaa()中 this 指向的是 window 但是为什么 this.a 为什么是 undefined

阅读 2.6k
5 个回答

因为题主没有在window上声明变量a,题主声明的变量在自执行函数里,属于自执行函数的局部变量,不属于window

(function(){
    var a = 11111;
    console.log(this.a);  //[1] 

    var Test = function(a){
        this.a = a; //[2]
    }
    Test.prototype.geta=function(){
        console.log(this.a)
        console.log(this);
    }
    var test = new Test('a');
    test.geta();//[3]

    var getaaa = test.geta;//[4]
    getaaa();    

})()

[1] this指向全局winow对象或nodejs环境下的global变量, 在全局对象下,没有定义变量啊,所以输出undefined
[2] 当Test作为普通函数调用时,指向全局winow对象或nodejs环境下的global变量;作为构造函数通过new调用时,指向创建的Test实例对象
[3]getah函数作为test实例对象的一个方法调用,此时的this指向test实例对象
[4] getaaa指向一个普通的函数对象和test实例对象没有任何关系,getaaa调用时,this指向指向全局winow对象或nodejs环境下的global变量

不知道题主注意到前面的console(this.a)没,一样也是undefined,this一样是指向window。
关键是你声明的1111的a是在自执行函数里面的,而不是在全局,所以window.a并没有声明和赋值

window上没有这个属性,自然返回undefined

第一行undefined就是window.a的输出值。
你去掉最外层的(function(){})()试试
(function(){})()本身的作用就是防止变量污染全局变量。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题