JavaScript的this指向

119 阅读2分钟

函数的this指向

  1. 概述

    if(被调用的函数属于某一对象obj) {
        this = obj;
    }else{
        this = 某个环境(window)
    }
    
  2. 独立函数调用(独立指没有显性跟任何对象绑定)

    这种函数的this默认指向window

    1. 在全局中创建函数,并调用
    function test() {
        console.log(this);
    }
    console.log(window.test)//test
    test();//window.test();
    

    在全局作用域创建一个函数,函数调用是单独调用(没有使用xx对象.b()调用)。所以this指向window

    1. 在某个函数中创建函数,并且调用
      let obj = {
          name: "xiaomi",
          myMethods() {
              function test() {
                  console.log(obj.test);//undefined
                  console.log(window.test);//undefined
                  console.log("-------");  
                  console.log(this);//window
              }
              test();
          }
      }
      obj.myMethods();
      

      obj调用myMethods方法,在方法里面创建一个函数,该函数没有绑定到任何对象上(比如obj.test = function(){}),也没有由obj执行(比如obj.test());但是该函数执行时的this默认指向window

    2. 隐式丢失
      let obj = {
          name: "小米",
          sayThis() {
            console.log(this);
          }
        }
        var b = obj.sayThis;
        console.log(window.b);//sayThis() {console.log(this);}
        b();//window
      

      设obj.sayThis指向的函数为该函数,在执行var b = obj.sayThis, b便指向该函数。如果声明使用var, b便绑定在window对象上。b在调用的时候是独立调用(没有使用xx对象.b()调用),所以指向window

    3. 回调函数
      let obj1 = {
          b() {
              console.log(this);//window
          }
      }
      function a(callback) {
          callback();
      }
      
      a(obj1.b)
      

      设obj.b为该函数,a函数调用的时候,将该函数赋值给a函数内执行作用域内callback变量, callback没有绑定任何的对象,所以是独立调用,默认指向window

  3. 对象调用函数

    1. 普通对象调用
    let obj = {
        name: "小米",
        sayThis() {
            console.log(this);
        }
    }
    obj.sayThis();//obj
    

    sayThis是绑定在obj对象的方法,并且由obj调用,所以this指向obj

    1. 鼠标事件调用
      <body>
        <button id="btn">按钮</button>
        <script>
          let btn = document.getElementById("btn");
          btn.onclick = function() {
            console.log(this);
          }
          //<button id="btn">按钮</button>
        </script>
      </body>
      

      函数被赋值给btn的onclick属性,btn调用onclick,this指向btn

  4. new 新对象

    function Person() {
        this.name = "小米";
        console.log(this);
    }
    new Person();//Person
    
  5. 箭头函数

    官方概念: 箭头函数内部的this总是指向词法作用域(定义时所在的对象)

    function中的this指向的是使用时所在的对象,而箭头函数中的this指向定义时所在的对象

    个人理解:在箭头函数定义的旁边打印的this就是箭头函数内部的this指向

    let fn = ()=> {
        console.log(this)
    }
    //在箭头函数定义的旁边打印的this就是箭头函数内部的this指向
    console.log(this);//window
    fn();//window
    
    var obj = {
        age: 20,
        say: () => {
            console.log(this);
        }
    }
    //在箭头函数定义的旁边打印的this就是箭头函数内部的this指向
    console.log(this);
    obj.say(); 
    
    var obj = {
        age: 20,
        say() {
            //在箭头函数定义的旁边打印的this就是箭头函数内部的this指向
            console.log(this);//obj
            let a = ()=> {
                console.log(this);//obj
            }
            a();
        }
    }
    obj.say();