this指向共分为4个关键点:

常见this,new 实例化this,箭头函数,apply、bind、call

1. 常见this

归根结底一句话,谁最终调用函数,this指向谁!!,下面直接看例子

  1. var name = 'Bill';
  2. var person = {
  3. name: 'Alice',
  4. sayName: function () {
  5. console.log(this.name)
  6. }
  7. }
  8. person.sayName(); // Alice
  9. ----------------------------------
  10. var name = 'Bob',
  11. person = {
  12. name: 'Alice',
  13. sayName: function () {
  14. console.log(this === person); // true
  15. return function () {
  16. console.log(this === person); // false
  17. console.log(this === window); // true
  18. console.log(this.name); // Bob
  19. }
  20. }
  21. }
  22. person.sayName()();
  23. // 可以看作先调用person.sayName() 则指向person
  24. // 再调用函数fn(),因为在外部调用则this指向window
  25. ----------------------------------
  26. var name = 'boss';
  27. var boss1 = {
  28. name: 'boss1',
  29. returnThis () {
  30. return this
  31. }
  32. }
  33. var boss2 = {
  34. name: 'boss2',
  35. returnThis () {
  36. return boss1.returnThis()
  37. }
  38. }
  39. var boss3 = {
  40. name: 'boss3',
  41. returnThis () {
  42. var returnThis = boss1.returnThis
  43. return returnThis()
  44. }
  45. }
  46. boss1.returnThis() // this指向 boss1
  47. boss2.returnThis() // this指向 boss1
  48. boss3.returnThis() // this指向 window

2. new实例化的this指向

  1. // 只指向实例化的对象
  2. var name = 'Bob';
  3. function Person(name) {
  4. this.name = name;
  5. return this;
  6. }
  7. var person1 = new Person('Alice');
  8. console.log(person1.name); // Alice
  9. ----------------------------------
  10. var name = 'Bob';
  11. function Person(name) {
  12. this.name = name;
  13. return {
  14. name: 'LiLei'
  15. };
  16. }
  17. var person1 = new Person('Alice');
  18. console.log(person1.name); // LiLei
  19. // 如果在构造器中返回一个指定对象则this指向返回的对象

3. 箭头函数中this指向

  1. // 箭头函数主要看在哪里被创建
  2. // 箭头函数的this指向是不会被call apply bind改变的
  3. function callback (cb) {
  4. cb()
  5. }
  6. callback(() => { console.log(this) }) // window
  7. var boss1 = {
  8. name: 'boss1',
  9. callback: callback,
  10. callback2 () {
  11. callback(() => { console.log(this) })
  12. }
  13. }
  14. boss1.callback(() => { console.log(this) }) // boss1
  15. boss1.callback2() // boss1
  16. -----------------------------------
  17. var returnThis = () => this
  18. returnThis() // window
  19. var boss1 = {
  20. name: 'boss1',
  21. returnThis () {
  22. var func = () => this
  23. return func()
  24. }
  25. }
  26. returnThis.call(boss1) // window 因为箭头函数不会被改变
  27. var boss1returnThis = returnThis.bind(boss1)
  28. boss1returnThis() // window 因为箭头函数不会被改变
  29. boss1.returnThis() // boss1 因为箭头函数是啊在boss1中被定义 拿去上下文this
  30. var boss2 = {
  31. name: 'boss2',
  32. returnThis: boss1.returnThis
  33. }
  34. boss2.returnThis()
  35. /***可以改写为如下 同等***/
  36. var boss2 = {
  37. name: 'boss2',
  38. returnThis: func = () => this
  39. }
  40. boss2.returnThis() // boss2

4. apply,call,bind 决定this指向

  1. // 他们三个第一个参数都可以改变this的指向
  2. // bind返回的是一个新的函数表达式,call,apply是函数的调用
  3. // apply跟call比 第二个参数不一样 apply接收的是一个数组