javascript中this详解

判断方法

this永远指向一个对象,但普通函数与箭头函数this指向不同。

普通函数:

普通函数的this是动态的,由函数是如何被调用的来决定。

①this所在函数是否使用了new以构造函数方式来调用函数,如果是则指向新创建的对象

②this所在函数是否使用(对象.属性)的方式调用函数(如Obj.say),即函数为对象的属性,如何是则指向这个对象

③如果以上两条均不是则指向全局对象

箭头函数:

箭头函数的this是固定的,箭头函数本身没有this,它的this就是函数定义时的外层环境的this,如何外层仍然是箭头函数则继续向上查找,直到找到一个普通函数或到达全局对象,外层环境的this指向仍需要使用普通函数的判断方法来判断。

误区

在阮一峰老师的ES6中有这么一句话:

看完这句话很简单,仿佛就和其他面向对象语言一样,这直接指向定义时所处对象,但这句话是有问题,有歧义的,看下面的例子:

  var obj={
     say:()=>{
       console.log(this); 
     }
  }
obj.say()  //??

很多人一定会说,定义时所在的对象,那就是obj啊,这么简单。然而,这个this指向的是全局对象。this指向的是定义时的最近外层非箭头函数,很明显这个箭头函数外没有函数了,所以指向了全局。

来看下面改写后的例子。

  var obj = {
    say: function () {
      setTimeout(() => {
        console.log(this)
      });
    }
  }
  obj.say(); // obj

 

注意点

在一些情况下全局对象并不是window,例如在VUE中全局对象为VUE实例。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值