在js中,this的指向就是调用这个函数的对象,如果没有明确指明对象是什么,那就是全局对象window

如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象

var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //12
        }
    }
}
o.b.fn();

这个例子中虽然函数包含多个对象,但是this依然指向上一次的对象

var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //undefined
            console.log(this); //window
        }
    }
}
var j = o.b.fn;
j();

这是一个特例,这里的this指向的是window,因为this永远是指向最终调用这个函数的对象,这里将o.b.fn这个函数赋值给了j,最终用j()调用了这个函数,那调用这个函数的就是window,this也指向window而不是b

this始终指向调用它的对象,可能的方式有:

  • 默认绑定:指向全局对象。
  • 隐式绑定:调用的对象。
  • 显示绑定:call、apply、bind方法改变指向。
  • New绑定:指向新创建的对象。