网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1357|回复: 0
打印 上一主题 下一主题

[前端开发] ES6新函数!箭头函数有什么优势呢?

[复制链接]

271

主题

284

帖子

1243

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1243

最佳新人活跃会员热心会员突出贡献优秀版主

跳转到指定楼层
楼主
发表于 2020-5-8 18:01:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
更短的函数
  1. var elements = [
  2.   'Hydrogen',
  3.   'Helium',
  4.   'Lithium',
  5.   'Beryllium'
  6. ];

  7. elements.map(function(element) {
  8.   return element.length;
  9. }); // 返回数组:[8, 6, 7, 9]

  10. // 上面的普通函数可以改写成如下的箭头函数
  11. elements.map((element) => {
  12.   return element.length;
  13. }); // [8, 6, 7, 9]

  14. // 当箭头函数只有一个参数时,可以省略参数的圆括号
  15. elements.map(element => {
  16. return element.length;
  17. }); // [8, 6, 7, 9]

  18. // 当箭头函数的函数体只有一个 `return` 语句时,可以省略 `return` 关键字和方法体的花括号
  19. elements.map(element => element.length); // [8, 6, 7, 9]

  20. // 在这个例子中,因为我们只需要 `length` 属性,所以可以使用参数解构
  21. // 需要注意的是字符串 `"length"` 是我们想要获得的属性的名称,而 `lengthFooBArX` 则只是个变量名,
  22. // 可以替换成任意合法的变量名
  23. elements.map(({ "length": lengthFooBArX }) => lengthFooBArX); // [8, 6, 7, 9]
复制代码
没有单独的this
在箭头函数出现之前,每一个新函数根据它是被如何调用的来定义这个函数的this值:
  • 如果是该函数是一个构造函数,this指针指向一个新的对象
  • 在严格模式下的函数调用下,this指向[backcolor=rgba(220, 220, 220, 0.5)]undefined
  • 如果是该函数是一个对象的方法,则它的this指针指向这个对象
  • 等等
This被证明是令人厌烦的面向对象风格的编程。
  1. function Person() {
  2.   // Person() 构造函数定义 `this`作为它自己的实例.
  3.   this.age = 0;

  4.   setInterval(function growUp() {
  5.     // 在非严格模式, growUp()函数定义 `this`作为全局对象,
  6.     // 与在 Person()构造函数中定义的 `this`并不相同.
  7.     this.age++;
  8.   }, 1000);
  9. }

  10. var p = new Person();
复制代码
在ECMAScript 3/5中,通过将this值分配给封闭的变量,可以解决this问题。
  1. function Person() {
  2.   var that = this;
  3.   that.age = 0;

  4.   setInterval(function growUp() {
  5.     //  回调引用的是`that`变量, 其值是预期的对象.
  6.     that.age++;
  7.   }, 1000);
  8. }
复制代码
或者,可以创建绑定函数,以便将预先分配的this值传递到绑定的目标函数(上述示例中的growUp()函数)。
箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this。因此,在下面的代码中,传递给setInterval的函数内的this与封闭函数中的this值相同:
  1. function Person(){
  2.   this.age = 0;

  3.   setInterval(() => {
  4.     this.age++; // |this| 正确地指向 p 实例
  5.   }, 1000);
  6. }

  7. var p = new Person();
复制代码
与严格模式的关系
鉴于 this 是词法层面上的,严格模式中与 this 相关的规则都将被忽略。
  1. var f = () => { 'use strict'; return this; };
  2. f() === window; // 或者 global
复制代码

严格模式的其他规则依然不变.
通过 call 或 apply 调用
由于 箭头函数没有自己的this指针,通过 call() apply() 方法调用一个函数时,只能传递参数(不能绑定this---译者注),他们的第一个参数会被忽略。(这种现象对于bind方法同样成立---译者注)
  1. var adder = {
  2.   base : 1,
  3.    
  4.   add : function(a) {
  5.     var f = v => v + this.base;
  6.     return f(a);
  7.   },

  8.   addThruCall: function(a) {
  9.     var f = v => v + this.base;
  10.     var b = {
  11.       base : 2
  12.     };
  13.             
  14.     return f.call(b, a);
  15.   }
  16. };

  17. console.log(adder.add(1));         // 输出 2
  18. console.log(adder.addThruCall(1)); // 仍然输出 2
  19. 不绑定arguments
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-12-22 15:48 , Processed in 0.034263 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表