【ES6】es6箭头函数的this指向

本文详细解读了ES6箭头函数的定义、简化的回调用法,强调其没有独立this和不可用作构造函数等特点,并通过实例演示了如何在Ant Design穿梭框组件中利用箭头函数避免this指向问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!

在这里插入图片描述

箭头函数

ES6 允许使用“箭头”=>定义函数。

// 如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。
var f = () => 5;
// 等同于
var f = function () { return 5 };

var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
  return num1 + num2;
};

箭头函数的一个用处是简化回调函数:

// 普通函数写法
[1,2,3].map(function (x) {
  return x * x;
});
// 箭头函数写法
[1,2,3].map(x => x * x);

// 普通函数写法
var result = values.sort(function (a, b) {
  return a - b;
});
// 箭头函数写法
var result = values.sort((a, b) => a - b);

注意

  1. 箭头函数没有自己的this对象(重要)。

  2. 不可以当作构造函数,也就是说,不可以对箭头函数使用new命令,否则会抛出一个错误。

  3. 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。

  4. 不可以使用yield命令,因此箭头函数不能用作 Generator 函数。

上面四点中,最重要的是第一点。
对于普通函数来说,内部的this指向函数运行时所在的对象,但是这一点对箭头函数不成立。
箭头函数没有自己的this对象,内部的this就是定义时上层作用域中的this
也就是说,箭头函数内部的this指向是固定的,相比之下,普通函数的this指向是可变的。

总之,箭头函数根本没有自己的this,导致内部的this就是它所在的外层父级函数代码块的this。正是因为它没有this,所以也就不能用作构造函数。

下面是 Babel 转箭头函数产生的 ES5 代码,就能清楚地说明this的指向。

// ES6
function foo() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}

// ES5
function foo() {
  var _this = this;

  setTimeout(function () {
    console.log('id:', _this.id);
  }, 100);
}

上面代码中,转换后的 ES5 版本清楚地说明了,箭头函数里面根本没有自己的this,而是引用外层的this
javascript函数通过function关键词来定义,因为箭头函数没有function,所以箭头函数没有形成自己的作用域,箭头函数可以看作为一种语法糖。

我的实际使用

在使用ant design的穿梭框组件的时候,我需要做穿梭值的二次校验,[nzCanMove]="canMove"使用普通函数的定义方法定义canMove()函数会导致无法取到外层的this,以至于无法使用弹窗提醒。换为箭头函数就可以完美解决问题。

<nz-transfer
  [nzDataSource]="list"
  [nzCanMove]="canMove"
  (nzSelectChange)="select($event)"
  (nzChange)="change($event)"
>
</nz-transfer>
// 二次校验
canMove = (arg: TransferCanMove): Observable<TransferItem[]>  => {
  let items = arg.list;
  if (arg.direction === 'right' && arg.list.length > 0) {
    if (items[0].unitId) {
      // 此处的this指向canMove函数外部的this
      this.mdlSnackbarService.showToast('此人员被其他部门关联,如有疑问请咨询管理员!');
    } else {
      this.addStaff(items[0]);
      items[0].staffTYpe = 0;
      return of(arg.list);
    }
  } else if (arg.direction === 'left' && arg.list.length > 0){
    return of(arg.list);
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卸载引擎

如果对您有帮助,请赏个饭吃

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值