JS中的this、apply、call、bind
1、来看一个最简单的例子:例 1:

3、在这个例子中,函数 fn 是对象 a 调用的,所以打印的值就是 a 中的 name 的值。做一个小小的改动:例 3:

5、调用 fn 的是 a 对象,也就是说 fn 的内部的 this 是对象 a,而对象 a 中并没有对 name 进行定义,所以 log 的 this.name 的值是 undefined。这个例子还是说明了:this 永远指向最后调用它的那个对象,因为最后调用 fn 的对象是 a,所以就算 a 中没有 name 这个属性,也不会继续向上一个对象寻找 this.name,而是直接输出 undefined。再来看一个比较坑的例子:例 5:

7、怎么改变 this 的指向改变 this 的指向我总结有以下几种方法:使用 ES6 的箭头函数在函数内部使用 _this = this使用 apply、call、bindnew 实例化一个对象例 7:

9、在函数内部使用 _this = this如果不使用 ES6,那么这种方式应该是最简单的不会出错的方式了,先将调用这个函数的对象保存在变量 _this 中,然后在函数中都使用这个 _this,这样 _this 就不会改变了。例 9:

11、使用 call例 11:

13、apply、call、bind 区别已经介绍了 apply、call、bind 都是可以改变 this 的指向的,但是这三个函数稍有不同。在 MDN 中定义 apply 如下;apply() 方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数语法:

15、所以 apply 和 call 的区别是 call 方法接受的是若干个参数列表,而 apply 接收的是一个包含多个参数的数组。例 13:例 14:

17、bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。bind 是创建一个新的函数,必须要手动去调用:
