在确定身份时我们需要问两个问题: 1,我是谁;2,我在那

一,考虑一下情景

  • 问:我是学生,我在哪(this = ?)?
    答:学校
  • 问:我是员工,我在哪(this = ?)?
    答:公司
  • 问:我是中国人,我在哪(this = ?)?
    答:中国
  • 问:我去参加运动会,挂着我们学校的名牌,我在哪(this = ?)?
    答:xxx实验高中

二,再看javascript中的this指向

考虑下面的代码

// test01.jsfunction fa(){    console.log(this)}var obja = {    fb: function(){        console.log(this)    }}var objb = {};var fc = obja.fb;//执行fa();obja.fb();fc();fa.call(objb);fa.apply(objb);
1,fa()直接调用

这是告诉浏览器函数fa是全局作用域(window)下的一个函数,这时候去问fa在哪?,答:全局作用域,this = window

2,obja.fb()

这是告诉浏览器函数fb是对象obja的一个属性,这时候去问fb在哪?,答:obja,this = obja

3,fc()

fc是obja.fb的引用,这里有一点需要注意this的指向是在执行阶段确定的,fc和fa的执行方式是一样的,运动会比赛时穿同样的校服所以是同一个学校的,问:fc在哪?,答:和fa一样全局作用域,this = window

4,fa.call(objb) / fa.apply(objb)

进行跑步比赛时同一个学校的学生会被分到一个跑道上面去,在javascript中这个过程通过callapply实现。运动员fa在跑道objb学校的跑道上面跑,问:fa在哪? 答:objb,this = objb

总结

简单来说是在谁上调用就指向谁。

  • 通过函数名直接调用fa();fc(),相当于是在window上面调用,this指向window;
  • 通过对象属性名调用obja.fb(),this 指向该对象
  • 通过指定this的方式调用fa.call(objb);fa.apply(objb),指定的是谁就指向谁