示例1

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <body>
  4. <button id="commonBtn">common btn</button>
  5. <button id="arrowBtn">arrow btn</button>
  6. <button id="bindFn">arrow btn</button>
  7. <script>
  8. class Obj {
  9. constructor() {
  10. this.state = {
  11. type: 'account'
  12. }
  13. this.getThisWithBind = this.getThisWithBind.bind(this)
  14. }
  15. getThis() {
  16. console.log(this, "---common fn---")
  17. }
  18. getThisWithArrow = () => {
  19. console.log(this, "---arrow fn---")
  20. }
  21. getThisWithBind() {
  22. console.log(this, "---bind fn---")
  23. }
  24. }
  25. const myObj = new Obj();
  26. /**
  27. * 关键在这里,参看阮一峰的this指向blog
  28. * http://www.ruanyifeng.com/blog/2018/06/javascript-this.html
  29. */
  30. const commonFn = myObj.getThis
  31. const arrowFn = myObj.getThisWithArrow
  32. const bindFn = myObj.getThisWithBind
  33. document.querySelector('#commonBtn').addEventListener('click', commonFn)
  34. document.querySelector('#arrowBtn').addEventListener('click', arrowFn)
  35. document.querySelector('#bindFn').addEventListener('click', bindFn)
  36. </script>
  37. </body>
  38. </html>

image.png

  • 普通方法的this指向变成了事件对象
  • 箭头函数的this指向和bind后的一样还是这个类对象

示例2

  class A {
      constructor() {
        this.x = 1;
      }
    }
    class B extends A {
      constructor() {
        super();
        this.x = 2;
        console.log(this);    // B
        // this.getme = this.getme.bind(this)
      }
      getName() {
        console.log(this, "====="); // B
        let m = this.getme
        m()
      }
      getme() {
        console.log(this, "-----"); // undefined
      }
    }
    let b = new B();
    b.getName()

这里变成了 undefined

let m = this.getme
m()

将方法进行赋值之后,丢失了上下文,导致 this 变成 undefined ,
这个方法提出来单独使用,this会指向该方法运行时所在的环境(ES6标准入门 p411),
this之所以没有变为window 是因为类声明和类表达式的主体以 严格模式 执行,主要包括构造函数、静态方法和原型方法。Getter 和 setter 函数也在严格模式下执行。

参考
阮一峰es6标准入门
http://es6.ruanyifeng.com/#docs/class#%E6%B3%A8%E6%84%8F%E7%82%B9
阮一峰this指向
http://www.ruanyifeng.com/blog/2018/06/javascript-this.html