IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【ES6】es6箭头函数的this指向 -> 正文阅读

[游戏开发]【ES6】es6箭头函数的this指向

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

在这里插入图片描述

箭头函数

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);
  }
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:25:48  更:2022-03-21 21:28:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 18:55:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码