this 抓住这一点就够了

this:当前(最后)的方法属于谁,它就指向谁.

关键是“当前(最后)“这几个字,其实this的指向问题很多时候就是中间太多层关系,各种变量赋值把人搞晕了.

如何判断属于谁
  1. 属性属于主人
  2. 找不到就是全局(如window)
const log=console.log
function show() {
    log(this);//=>window
}
show();//和window.show()一样

var a={};
a.show=function () {
    log(this);//=>a
};
a.show();



一些相关的笔试题,作为练习

var obj = {
  a: 10,
  b: {
      a: 12,
      fn: function () {
          console.log(this.a); //undefined
          console.log(this); //window
      }
  },
  c:function () {
    console.log('c:'+this.a)
  }
}
var fn = obj.b.fn;//变量fn只是引用了obj.b.fn这个函数 和fn=function(){console.log(a)}这种函数表达式是一样的
fn();//this=>window this.a=>undefined
obj.b.fn()//=>12;因为fn的最后调用者(主人)是obj.b;即this=>obj.b
//同理下面的就更简单了
obj.c();//=>10
fn=obj.c
fn()//=>c:undefined

结合闭包

const myOject={
  foo:'bar',
  func:function(){
    var self=this
    console.log(this.foo)//1.bar
    console.log(self.foo)//2. bar
    return function(){
      console.log(this.foo)//3.undefined 因为this指向了全局对象
      console.log(self.foo)//4.bar 闭包缘故,self=>保存了的外部变量
    }
  }
}
var fn=myOject.func()//1.bar 2.bar 
fn()//3.undefined 4.bar

你可能感兴趣的:(javascript)