this指向例子
关于普通函数中this对象记住两点:
1、this对象是函数在运行时基于函数的执行环境绑定的。
2、我们直到函数在被调用时,都会自动取得两个特殊变量this和arguments。函数内在搜索这两个变量时只会搜索到自己的活动对象,不会像其它普通变量一样通过作用域向上去搜索。
关于箭头函数中this对象:
1、箭头函数this对象是在函数定义时绑定的,会指向最靠近该箭头函数的函数的环境(对象不算)。
2、箭头函数调用时,没有arguments和this特殊变量,对箭头函数而言,他们就是普通变量,会沿着作用域去查找,找到最近一层函数作用域(比如{}对象的this不算哦)中的this或者arguments。而最近一层函数应该是个普通函数,它的this对象指向,就按上面普通函数的方法去找。
3、箭头函数除了语法更精简,主要优点是解决了setTimeout、setInterval内函数的this指向问题(原本指向全局),现在可以就近指向。
下面先来看看普通函数的this指向:

b()其实就是window.b(),执行环境是window对象,所以this对象绑定的是window对象,也就返回了全局对象‘111’。

首先obj.getA()函数的执行环境是obj,所以getA函数的this对象也就指向obj。
obj.getA()返回的匿名函数,该函数的执行环境是全局环境,所以this指向全局对象,也就返回"111"。
你可能会误以为匿名函数的this对象会根据作用域往上查找,其实并不会。

h函数是自己执行的,相当于执行环境是全局环境。

obj.getA()的执行环境是obj,函数内的this也就指向obj。
把obj.get函数取出来后,在外部执行,执行环境就是全局环境,函数内的this也就指向全局变量。

o.b.fn(),函数fn的执行环境是b对象,但b对象中并无a变量,所以返回undefined。
当this碰到return时:如果返回值是一个对象(不包括null),那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。

下面来看看箭头函数:
setTimeout和setInterval中this指向的问题
setTimeout和setInterval中写入的函数func相当于闭包,函数func被return出来了。所以函数func中的this会指向全局。如果想要this指向正确的值,有3种方法。
1、将当前对象的this存为一个变量,定时器内函数引用的变量都会因为闭包的作用而长久持有、不被垃圾收集器回收。

变量指定
2、箭头函数,箭头函数内的this指向 当前父级上下文环境。其实就是前一种的方法,给我们做了简化。

箭头函数
3、bind()方法,Function.prototype上的一个方法,当被绑定函数执行时,bind方法会创建一个新函数,并将第一个参数作为新函数运行时的this。

bind方法,当然使用call或apply方法来代替bind方法,得到的结果也是正确的,但是call方法会在调用之后立即执行,那样也就没有了延时的效果,定时器也就没有用了
