1.新增API——new.target

众所周知,js中构造函数需使用new来调用,但是即使不使用new关键字,也可以调用构造函数,如【例1-1】,为了解决这一问题,js的解决方式为使用instanceof查看原型上是否有该构造函数,如【例1-2】,到了es6提供了一个特殊的API,可以使用该API在函数内部,判断该函数是否使用new来调用,如【例1-3】

【例1-1】构造函数的两种调用方式

function Person(firstName, lastName) {this.firstName = firstName;this.lastName = lastName;this.fullName = `${firstName}${lastName}`;//纯碎是为了让p1有返回值return `${this.firstName} ${this.lastName} ${this.fullName}`
}
const p1 = Person("J", "wh");
const p2 = new Person('T','hs');
console.log(p1);
console.log(p2);

【结果】

图1-1

【例1-2】之前的解决方式

function Person(firstName, lastName) {if (!(this instanceof Person)) {throw new Error('该函数没有使用new来调用')}this.firstName = firstName;this.lastName = lastName;this.fullName = `${firstName}${lastName}`;
}
const p2 = new Person('T','hs');
console.log(p2);
const p1 = Person("J", "wh");
console.log(p1);

【结果】

图1-2-1

细心的读者可能已经发现了,这种间接的方法可能导致人为改变this指向后,使得原型链上有构造函数,即该判断是可以避开的,存在bug,如下例

const p2 = new Person('T', 'hs');
console.log(p2);
const p3 = Person.call(p2, 'J', 'wh')
console.log(p3)

【结果】

图1-2-2

因此,es6提供了新的API —— new.target去直接解决这一问题,该表达式的用法是:当没有使用new调用函数时,返回undefined;若使用了new来调用,则得到new关键字后面的函数本身

【例1-3】

function Person(firstName, lastName) {if (new.target === undefined) {throw new Error('该函数没有使用new来调用')}this.firstName = firstName;this.lastName = lastName;this.fullName = `${firstName}${lastName}`;
}
const p2 = new Person('T', 'hs');
console.log(p2);
const p3 = Person.call(p2, 'J', 'wh')
console.log(p3);

图1-3

2.箭头函数

(1) this指向

  • 通过对象调用函数,this指向对象
  • 直接调用函数,this指向全局对象
  • 如果通过new调用函数,this指向新创建的对象
  • 如果apply,call,bind调用函数,this指向指定的数据
  • 如果是dom时间函数,this指向事件源

下面给个定时器的例子

【例2-1-1】

const obj = {count: 0,start: function () {setInterval(function () {this.count++;console.log(this.count);}, 1000)}
}
obj.start();

【结果】本来代码想实现的效果是, 没隔一秒count加1,但是由于定时器的this指向window,因此打印结果为

图2-1-1

之前的解决方式是,在start方法中保存this指向,如下,则可以解决该问题

const obj = {count: 0,start: function () {//保存thisconst self = this;setInterval(function () {self.count++;console.log(self.count);}, 1000)}
}
obj.start();

(2)箭头函数

es6在解决上述问题时引入了箭头函数。箭头函数是一个函数表达式,理论上,任何使用函数表达式的场景都可以使用箭头函数

语法规则

  • 完整语法:(参数1, 参数2,...) => {函数体}
  • 如果只有一个参数,可以省略小括号:参数=>{函数体}【例2-2-2】
  • 如果箭头函数只有一条返回语句,可以省略大括号,和return关键字:参数=>返回值

箭头函数的特点

  • 箭头函数中,不存在this,arguments,new.target,如果使用了,则是函数外层的对应的this,arguments,new.target
  • 箭头函数没有原型
  • 箭头函数不能作用构造函数使用

应用场景

  • 临时性使用的函数,并不会且不可以调用它,如:事件处理函数,异步处理函数,其他临时性的函数
  • 为了绑定外层this的函数
  • 在不影响其他代码的情况下,保持代码的简洁,最常见的,数组方法中的回调函数

【例2-2-1】

const obj = {count: 0,start: function () {setInterval(() =>{this.count++;console.log(this.count);}, 1000)}
}
obj.start();

【例2-2-2】

const print = num => {console.log('打印:', num);
}
print(2);

【例2-2-3】

const sum = (a,b)=> ({a:a,b:b,sum:a+b
});
console.log(sum(3,5));

【例2-2-4】

const numbers = [3, 7, 4, 8, 9];
const result = numbers.filter(num => num % 2 !== 0).map(num => num * 2).reduce((a, b) => a + b)
console.log(result);

ES6函数第三篇:函数篇(新增API与箭头函数)相关推荐

  1. MT4/MQL4入门到精通EA教程第三课-MQL语言常用函数(三)-K线取值常用功能函数

    double iOpen(); double iOpen( string symbol, // 交易品种 int timeframe, // 周期 int shift // K线柱 ); iOpen( ...

  2. ES6 语法 之 let、const、模板字符串、箭头函数

    ES6 语法 ES6 语法 简介 let 关键字 模板字符串 const 关键字 js中const,var,let区别 箭头函数 ES6 语法 简介 ES6, 全称 ECMAScript 6.0 ,是 ...

  3. range函数python三个参数_python3.5如何使用range函数

    作用 产生一系列整数,返回一个range对象 语法: range(start,end,step) range(start,end) range(end) range函数中带有三个参数:start.en ...

  4. c语言trave函数,(三)C语言之字符串与字符串函数

    温馨提示 写博客是为了记录在开发过程中所涉及到的技术以及遇到的问题的解决,如果该博客对您有所帮助,希望可以点个关注/喜欢:如果您对文章中的内容有什么不同的见解,欢迎留言进行讨论.谢谢! (三)C语言之 ...

  5. 用sum函数求三个数和C语言,C语言用函数写两数之和.doc

    #include void main() { int a,b,sum; scanf("%d,%d",&a,&b); sum=a+b; printf("%d ...

  6. 深入理解this机制系列第三篇——箭头函数

    前面的话 this机制与函数调用有关,而作用域则与函数定义有关.有没有什么是可以将this机制和作用域联系起来的呢?本文将介绍ES6新增的内容--箭头函数 痛点 对于闭包的痛点在于,闭包的this默认 ...

  7. ES6/06/ES6简介,ES6新增语法,let声明变量,const声明常量,var,let和const总结,数组解构,对象解构,箭头函数,剩余参数

    ES6简介 ES全称:ECMAScript ; 由ECMA国际化组织制定的标准脚本语言的标准化规范: 为什么使用ES6? 每一次标准的诞生都意味着语言的完善,功能的加强,JavaScript语言本身也 ...

  8. button执行onclick函数_千万别再一直无脑使用ES6的箭头函数了,它虽然很有用但并不是万能的...

    相信很多小伙伴自从知道了ES6的箭头函数以后,都疯狂得使用,渐渐的淡忘了普通函数的使用.不过确实,箭头函数看起来比较简洁,用起来也舒服,不过它的出现是为了解决某一部分问题的,并不是用来替代普通函数的, ...

  9. ES6学习笔记二arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

最新文章

  1. java List集合中contains方法总是返回false
  2. 非常详细的sift算法原理解析
  3. JAVA性能诊断与调优
  4. JVM 内存区域大小参数设置
  5. 阿里巴巴AI夺肝结节诊断两项世界冠军,至今无人超越
  6. android wifi ap sta,WIFI的AP/Sta模式简单介绍
  7. 使用yum update更新文件系统时不更新内核的方法
  8. Python-Cartopy制图学习01-中国区域SPEI空间制图
  9. 精益生产理论学习总结(一)
  10. sandisk主控量产工具_[转载]群联PS3109主控固态硬盘修复教程_固态修复案例方法...
  11. 银河麒麟V10(Kylin Linux V10)安装 Kibana-7.15.2
  12. Windows 10 耳机插入前面板没反应的解决方案
  13. html怎么叠加透明图片,css – 您可以在图片上叠加透明div
  14. Android音视频开发:AudioRecord录制音频
  15. 深入浅出Oracle Spatial
  16. 11款学习编程好玩的浏览器游戏
  17. 家长会计算机教师致辞,家长会教师致辞最新
  18. 双目 机器视觉-- 测距
  19. 用php求圆柱圆锥的面积,认识圆锥体a href=http://ruiwen.com/friend/list.php(教师中心专稿)/a...
  20. 匀思电商:抖音短视频四大主流变现方式,你都知道哪些?

热门文章

  1. DLL入门浅析(5)——使用DLL在进程间共享数据
  2. VC 编译器的C++关键字 __super
  3. SurfaceFlinger 和 Hardware Composer
  4. Kafka分区分配策略(3)——自定义分区分配策略
  5. 双指针解决力扣两/三数之和问题
  6. 【推荐】技术人必看的音视频学习资源清单
  7. LiveVideoStack线上交流分享 ( 三 ) —— 实时视频通信质量评价及寻找视频质量甜点的方法...
  8. 编码服务正在步入云端
  9. 《Go语言圣经》学习笔记 第十章 包和工具
  10. Anaconda 安装 Tensorflow 教程