JavaScript 中 this 的指向问题

75 阅读2分钟

一:obj.fun()对象中的this指的是:.前的obj对象 --obj

     var obj={
        name:'ls',
        age:19,
        say(){
          console.log(this.age)
        }
    }
    obj.say()  

二:匿名函数自调和回调函数中的 this指向window;严格模式下this指向undefined

    // 方法中的this --  window
    function fun1(name){
      this.name= name ;
      console.log(this)
    }
    fun1('aa')

三:new构造函数()里面的this 指向new正在创建的新对象 -- person

    function fun2(name){
      this.name= name;
      this.say= function(){
        console.log(this)
      }
    }
    var person= new fun2('ls')
    person.say()

四:构造函数原型(.prototype.eat=function(){})里面的this指向”子对象.fun()”中点前子对象 -- person

    function fun3(name){
      this.name= name;
    }
    fun3.prototype.eat= function(){
        console.log(this)
    }
    var person= new fun3('ls')
    person.eat();

五:DOM事件处理函数里的this指向当前正在出发事件的.前的DOM元素对象

    button.onclick=function(){}
    或
    button.addEventListener(“click”,function(){…})

六:Vue中this默认都指当前vue对象

七:箭头函数中的this指向当前函数之外最近的作用域中的this

  • 几乎所有匿名函数都可用箭头函数简化
  • 箭头函数是对大多数匿名函数的简写

解析:根据上面的概念--箭头函数指向的是其最近的作用域中的this,也就是intr 方法中的this
根据第一点:对象中方法的this指向的是 .前的obj对象 也就是lilei;
结论:箭头函数中的this.sname == lilei.sname;

   var lilei = {
      sname: "Li Lei",
      friends: ["涛涛", "楠楠", "东东"],
      intr: function () {
        this.friends.forEach(
           (item)=> {
            console.log(`${this.sname} 认识 ${item}`)
          })
      }
    }
    lilei.intr(); 
    // Li Lei 认识 涛涛
    // Li Lei 认识 楠楠
    // Li Lei 认识 东东

思考:为什么把箭头函数改成function之后就this.sname == undefined 了?

    var lilei = {
      sname: "Li Lei",
      friends: ["涛涛", "楠楠", "东东"],
      intr: function () {
        this.friends.forEach(
           function (item) {
            console.log(`${this.sname} 认识 ${item}`)
          })
      }
    }
    lilei.intr(); 
    // undefined  认识 涛涛
    // undefined  认识 楠楠
    // undefined  认识 东东      

解析:参考第二点-匿名函数及自调用函数this指向window;见下图

image.png

备注:从上述内容可能会让你感觉--箭头函数没有作用域或者不是作用域!错误理解

解析:箭头函数只让this指向外部作用域this。而箭头函数内的局部变量,依然只能在箭头函数内使用。出了箭头函数不能用!

总结:箭头函数依然是作用域!只不过影响this而已!不影响局部变量

向东神致敬(* ̄︶ ̄)!