this —>javaScirpt 关键字
    当前环境执行期上下文对象的一个属性
    this在不同环境,不同作用下表现不同

    全局作用域下的this ——-> 全局对象
    window 和this的关系

    1. console.log(this ==== window) // true
    2. var a = 1

    this ——> 在浏览器 node worker
    获取全局变量
    web : window,self ,frames
    node: global
    worker:self
    通用:golbalThis
    image.png
    严格模式下this返回undefined
    image.png

    1. class Test1{
    2. constructor () {
    3. }
    4. sat (){}
    5. static do (){}
    6. }

    在构造函数内部

    1. function Test (){
    2. this.a = 1 // new 的过程是 1. this = {}
    3. this.b = 2 // 2. {a:1,b:2}
    4. console,log(this) =======> // 3. return this
    5. return {
    6. c:1, // 如果你是手动改变了return的值
    7. d:2 // 那么会改变,但是this的指向新
    8. } // 构造出来的值 {a:1,b:2}
    9. }
    10. let test =new Text()

    在函数内部

    1. let obj = {
    2. actions : function () {
    3. console.log(this) // 指向的是obj
    4. function test(){
    5. console.log(this) // 这个指向的是window
    6. }
    7. test()
    8. }
    9. obj.actions() // 这个

    在dom
    事件处理函数内部的this总是指向dom元素本身

    1. let oBtn = document.getElementById('j_btn')
    2. oBtn.onclick = function (){
    3. console.log(this)
    4. }
    5. oBtn.addEventListen('Click',function (){
    6. console,log(this)
    7. })
    1. function Foo() {
    2. getName = function () {
    3. console.log(1);
    4. }
    5. return this
    6. }
    7. Foo.getName = function () {
    8. console.log(2);
    9. }
    10. Foo.prototype.getName = function () {
    11. console.log(3);
    12. }
    13. var getName = function () {
    14. console.log(4);
    15. }
    16. function getName() {
    17. console.log(5);
    18. }
    19. Foo.getName()
    20. getName()
    21. Foo().getName()
    22. new Foo.getName()
    23. new Foo().getName()
    24. new new Foo().getName()
    1. //预编译过程
    2. 1. go:{
    3. getName : undefined // var 声明变量
    4. }
    5. 2. go:{ // function 声明变量
    6. getName : function getName() {
    7. console.log(5);
    8. }
    9. Foo: function Foo() {
    10. getName = function () {
    11. console.log(1);
    12. }
    13. return this
    14. }
    15. }
    16. 3. go:{ // var 赋值
    17. getName : function () {
    18. console.log(4);
    19. }
    20. Foo: function Foo() {
    21. getName = function () {
    22. console.log(1);
    23. }
    24. return this
    25. }
    26. }
    27. // js 执行过程
    28. 4. 执行 Foo.getName() // function用.来调用可以看作是一个对象调用自身的方法 // 2
    29. 5. 执行 getName() // 4
    30. 6. 执行 Foo().getName() ==>
    31. Foo() 完了之后
    32. go :{
    33. getName = function () {
    34. console.log(1);
    35. }
    36. }
    37. getName() // 1
    38. 7.执行 new Foo.getName() ==> 应为 .的优先级高于 new
    39. 先执行 Foo.getName() new 没有意义 // 2
    40. 8.执行 new Foo().getName() ==> 先执行 Foo() 然后new Foo(),最后 .getName()
    41. 所以执行 Foo.prototype.getName = function () {
    42. console.log(3);
    43. }
    44. 9.执行new new Foo().getName() ==> 1. new Foo().getName()
    45. 2. new new Foo().getName() 没有意义