ES6中的箭头函数=>

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。为什么叫Arrow Function?因为它的定义用的就是一个箭头:

x => x * x

相当于:

1function(x){ 2 3 4 5 return x*x; 6}

箭头函数相当于匿名函数,并且简化了函数定义。

箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this,arguments,super或new.target。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。

箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ … }和return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ … }和return:

1x => { 2 3 4 5 if (x > 0) { 6 7 8 9 return x * x; 10 } 11 else { 12 13 14 15 return - x * x; 16 } 17}

如果参数不是一个,就需要用括号()括起来:

1// 两个参数: 2(x, y) => x * x + y * y 3 4// 无参数: 5() => 3.14 6 7// 可变参数: 8(x, y, ...rest) => { 9 10 11 12 var i, sum = x + y; 13 for (i=0; i<rest.length; i++) { 14 15 16 17 sum += rest[i]; 18 } 19 return sum; 20}

如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:

1// SyntaxError: 2x => { 3 4 5 foo: x }

因为和函数体的{ … }有语法冲突,所以要改为:

1// ok: 2x => ({ 3 4 5 foo: x })

this

箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定。

回顾前面的例子,由于JavaScript函数对this绑定的错误处理,下面的例子无法得到预期结果:

1var obj = { 2 3 4 5 birth: 1990, 6 getAge: function () { 7 8 9 10 var b = this.birth; // 1990 11 var fn = function () { 12 13 14 15 return new Date().getFullYear() - this.birth; // this指向window或undefined 16 }; 17 return fn(); 18 } 19};

现在,箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者obj:

1var obj = { 2 3 4 5 birth: 1990, 6 getAge: function () { 7 8 9 10 var b = this.birth; // 1990 11 var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象 12 return fn(); 13 } 14}; 15obj.getAge(); // 25

更多箭头函数示例如下:

1// 空的箭头函数返回 undefined 2let empty = () => { 3 4 5 }; 6 7(() => 'foobar')(); 8// Returns "foobar" 9// (这是一个立即执行函数表达式,可参阅 'IIFE'术语表) 10 11 12var simple = a => a > 15 ? 15 : a; 13simple(16); // 15 14simple(10); // 10 15 16let max = (a, b) => a > b ? a : b; 17 18// Easy array filtering, mapping, ... 19 20var arr = [5, 6, 13, 0, 1, 18, 23]; 21 22var sum = arr.reduce((a, b) => a + b); 23// 66 24 25var even = arr.filter(v => v % 2 == 0); 26// [6, 0, 18] 27 28var double = arr.map(v => v * 2); 29// [10, 12, 26, 0, 2, 36, 46] 30 31// 更简明的promise链 32promise.then(a => { 33 34 35 36 // ... 37}).then(b => { 38 39 40 41 // ... 42}); 43 44// 无参数箭头函数在视觉上容易分析 45setTimeout( () => { 46 47 48 49 console.log('I happen sooner'); 50 setTimeout( () => { 51 52 53 54 // deeper code 55 console.log('I happen later'); 56 }, 1); 57}, 1); 58 59 60var simple = a => a > 15 ? 15 : a; 61simple(16); // 15 62simple(10); // 10 63 64let max = (a, b) => a > b ? a : b;

本文为学习笔记,如有错漏,欢迎指出!

参考:

【1】:箭头函数
【2】:内部培训资料

本文分享 CSDN - 三分恶。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

AndroidStudio封装SDK的那些事

<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael

ES6新增内容(部分)

ES6新增内容(部分)一、两个声明变量的方法let、constlet:不能重复声明、有暂时性死区,不能提前访问、{}块级作用域。const:声明常量、声明之后不能被修改。二、箭头函数语法:(参数){表达式}箭头函数中this没有固定指向,一般指向宿主对象。