首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【ES6基础】箭头函数(Arrow functions)

【ES6基础】箭头函数(Arrow functions)

原创
作者头像
前端达人
修改于 2019-03-03 15:10:52
修改于 2019-03-03 15:10:52
94900
代码可运行
举报
文章被收录于专栏:前端达人前端达人
运行总次数:0
代码可运行

ES6中,除了let和const新特性,箭头函数是使用频率最高的新特性了。如果你曾经了解如日中天的JavaScript衍生语言CoffeeScript, 就会清楚此特性并非ES6独创。箭头函数顾名思义是使用箭头(=>)定义的函数,属于匿名函数一类。

今天的文章内容将会从以下几个方面,介绍箭头函数:

  • 使用语法
  • this穿透
  • 箭头函数和传统函数的区别

本篇文章阅读时间预计8分钟

使用语法

箭头函数有四种使用语法

1、单一参数的单行箭头函数

如下段代码所示,很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fn= foo =>`${foo} world`;

这是箭头函数最简洁的形式,常用于用作简单的处理函数,如过滤。如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let array=['a','bc','def','ghij'];
array=array.filter(item=>item.length>=2);

2、多参数的单行箭头函数 语法也很简单,如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fn=(foo,bar) => foo+bar

在实际开发中,函数的参数不会只有一个,在箭头函数中,多参数的语法跟普通函数一样,用括号包裹参数项。我们经常处理函数,如排序,示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let array=['a','bc','def','ghij'];
array=array.sort((a,b) => a.length < b.length);

3、多行箭头函数 单一参数,如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foo => {
    return `${foo} world`;
}

多参数,如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(foo,bar) => {
    return foo+bar;
}

4、无参数箭头函数

如果一个箭头函数无参数传入,则需要用一对空的括号来表示空的参数列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const greet = () => 'Hello World'

以上都是被支持的箭头函数的表达方式,其最大的好处就是简单明了,省略了function关键字,而使用 => 代替。相对于传统的function函数,箭头函数在简单的函数使用中更为简洁直观。

书写箭头的函数过程中,我们应该注意以下几点:

1、使用单行箭头函数时,应避免换行

错误的用法,如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fn=x
=> x*2 //SyntaxError

正确的写法,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fn= x => x*2 //ok

2、参数列别的右括弧、箭头应在一行

错误的用法,如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fn = (x,y) //SyntaxError
=> {
   return x*y;
}

下段代码书写是正确的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fn= (x,y) => { //ok
    return x*y
}

const fn= (x,
           y) => { //ok
    return x*y        
}

3、单行箭头函数返回只能包含一条语句

错误的书写,如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fn1= x => x=x*2; return x+2; //SyntaxError

正确的书写,如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fn2= x => {
    x=x*2;
    return x+2;
} //ok

4、如果单行箭头返回一个对象,请用圆括号包裹

错误的书写,如下段代码所示,解析引擎会将其解析成一个多行箭头函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const ids=[1,2,3];
const users=ids.map(id=>{id:id});
//wrong:[ undefined, undefined, undefined ]

正确的书写,如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const ids=[1,2,3];
const users=ids.map(id=>({id:id}));
//Correct:[ { id: 1 }, { id: 2 }, { id: 3 } ]

箭头函数十分简洁,特别适合单行回调函数的定义,比如我们有以下需求:

我们有一个这样的名字数组names,['Will','Jack','Peter','Steve','John','Hugo','Mike'],输出序号为偶数的名字[ 'Will', 'Peter', 'John', 'Mike' ],我们如何使用箭头函数在一行语句完成呢,如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const names=['Will','Jack','Peter','Steve','John','Hugo','Mike'];
const newSet=names
.map((name,index)=>({
    id:index,
    name:name
}))
.filter(man => man.id %2 ==0)
.map(man => [man.name])
.reduce((a,b) => a.concat(b))

this穿透

事实上,箭头函数不仅书写简洁,还有一个神奇的功能,就是将函数内部的this延伸上一层作用域中,及上一层的上下文会穿透到内层的箭头函数中,让我们先看一段实际的例子,如下段所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var Widget={
  // A
    init:function () {
    // B
        document.addEventListener("click", function (event){
    //C
            this.doSomething(event.type);
        }, false);
    },
    doSomething:function (type) {
        console.log("Handling"+ type+"event");
    }
};
Widget.init();

这段代码会如何输出呢,想必大家都猜到了吧,输出undefined,为什么呢?我们在B位置内声明了函数(C区域),this关键词的指向B区域的函数,由于B区域内没有doSomething函数声明,因此输出undefined,ES6之前我们如何修正此问题呢?

我们可以使用bind方法改变this指向A区域Widget对象,示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var Widget={
  // A
    init:function () {
        // B
        document.addEventListener("click", (function (event) {
            //C
            this.doSomething(event.type);
        }).bind(this), false);
    },
    doSomething:function (type) {
        console.log("Handling"+ type+"event");
    }
};
Widget.init();

下面这种方法是我们最常用的方法,我们在B区域声明了that变量,并将其this赋值,确保c区域this的指向至Widget对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var Widget={
 // A
    init:function () {
        // B
        var that=this;
        document.addEventListener("click", function (event) {
                //C
            that.doSomething(event.type);
            console.log(that);
        }, false);
    },
    doSomething:function (type) {
        console.log("Handling"+ type+"event");
    }
};
Widget.init();

有了箭头函数,我们可以使用箭头函数的this穿透功能,将this的作用域延伸至上一层B区域函数,如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var Widget={
//A
    init:function () {
    //B
        document.addEventListener("click", (event) => {
        //C
            this.doSomething(event.type);
        }, false);
    },
    doSomething:function (type) {
        console.log("Handling"+ type+"event");
    }
};
Widget.init();

箭头函数是不是更简单,代码更清晰呢。

还有一个情况需要注意,箭头函数对上下文的绑定是强制的,无法通过call或aplly进行改变,如下段代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function widget() {
    this.id=123;
    this.log=()=>{
      console.log(this)
        console.log('widget log',this.id);
    }
}

var pseudoWidget={
    id:456
};

new widget().log.call(pseudoWidget);//123

上述代码会如何输出呢,由于箭头函数对上下文的绑定是强制的,因此this指向不会指向pseudoWidget对象,因此输出123。

箭头函数和传统函数的区别

1、箭头函数作为匿名函数,是不能作为构造函数的,不能使用new

如下段代码所示,我们使用new方法,会提示如下信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const B =()=>({wechat:"前端达人"});
let b = new B(); //TypeError: B is not a constructor

2、箭头函数不绑定arguments,可以使用剩余参数(rest)解决

笔者在《【ES6基础】展开语法(Spread syntax)》文章里介绍过剩余参数,这里就不过多介绍,不清楚的可以点击文章链接进行查看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function A(a){
    console.log(arguments); //[object Arguments] {0: 1}
}

var B = (b)=>{
    console.log(arguments); //ReferenceError: arguments is not defined
}

var C = (...c)=>{ //...c即为rest参数
    console.log(c); //[3]
}
A(1);
B(2);
C(3);

3、箭头函数this指向具备穿透特性,会捕获其所在上下文的this值

4、箭头函数没有原型属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a = ()=>{
    return '前端达人';
}

function b(){
    return '前端达人';
}
console.log(a.prototype);//undefined
console.log(b.prototype);//object{...}

5、箭头函数不能当做Generator函数,不能使用yield关键字

6、箭头函数对上下文的绑定是强制的,无法通过call或aplly进行改变

小节

今天的内容就介绍到这里,我们可以看出使用箭头函能减少代码量,更加简介易读。在使用箭头函数时,我们一定要理解箭头函数和传统函数的区别,如果函数功能简单,只是简单的逻辑处理,尽量使用箭头函数。

ES6相关文章

【ES6基础】let和作用域

【ES6基础】const介绍

【ES6基础】默认参数值

【ES6基础】展开语法(Spread syntax)

【ES6基础】解构赋值(destructuring assignment)

更多精彩内容,请微信关注”前端达人”公众号!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[OHIF-Viewers]医疗数字阅片-医学影像-中间插播一下-es6-使用const加箭头函数声明函数相对于function声明函数有什么好处?
这个好多人都已经写过了,这里插播一下,在OHIF-Viewers里面有很多这样的写法,当然OHIF-Viewers维护者众多,有人用这种新的写法也有原始的写法,各种历史遗留的写法问题。
landv
2020/07/21
7560
ES6中的箭头函数
如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。
默默的成长
2022/12/05
7550
ES6的箭头函数的详细介绍
如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。
Javanx
2019/09/04
4680
ES6的箭头函数的详细介绍
ES6常用新特性学习4-箭头函数
这样的写法。但是ES6 提供了新的函数定义方法,即箭头函数。不仅在写法上简化了代码量,而且更重要的是提供了新的this指向。大家可以对比我之前的文章JS入门难点解析7-this进行阅读。
love丁酥酥
2018/08/27
4740
ES6--函数的扩展
但上例中y对应的值如果是false的话,该赋值就不起作用了,例如y是''空字符串:
Clearlove
2019/08/29
4990
【译】《Understanding ECMAScript6》- 第二章-函数
函数在任何一门编程语言中都是很重要的一个环节。JavaScript至今已有多年的历史,但是它的函数仍然停留在很初级的阶段。函数问题的大量堆积,以及某些函数非常微妙的功能差异,很容易产生错误,并且有时候一个很简单的功能往往需要通过大量的代码来实现。 ES6吸取了多年来JavaScript开发者的反馈,在ES5函数的基础上进行了大量的改进,令JavaScript程序更加健壮并且减少了错误发生率。 默认参数 JavaScript函数的特性之一,便是接受传入的参数可以与函数定义的参数数量不同。利用这种特性,函数可以
寒月十八
2018/01/30
1.4K0
函数的扩展
上面代码检查函数log的参数y有没有赋值,如果没有,则指定默认值为World。这种写法的缺点在于,如果参数y赋值了,但是对应的布尔值为false,则该赋值不起作用。就像上面代码的最后一行,参数y等于空字符,结果被改为默认值。
小小杰啊
2022/12/21
9450
ES6 函数的扩展
ES6 引入 rest 参数(形式为…变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
全栈程序员站长
2022/07/21
3580
ES6--对象、函数的扩展
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
5430
[第13期] 掌握前端面试基础系列一: ES6
这里我们可以看到, 第一行中的a虽然还没声明, 但是我们用起来却不会报错。这种情况, 就是变量声明的提升。
皮小蛋
2020/03/02
4190
ES6 完全使用手册
在我们开发的时候,可能认为应该默认使用 let 而不是 var,这种情况下,对于需要写保护的变量要使用 const。
夜尽天明
2019/07/17
1.5K0
ES6 系列之箭头函数
很多时候,你可能想不到要这样用,所以再来举个例子,比如在 React 与 Immutable 的技术选型中,我们处理一个事件会这样做:
夜尽天明
2019/06/28
5090
【ES6基础】解构赋值(destructuring assignment)
我们经常可以在其他编程语言(如GO语言)中看到多返回值这种特性,因为在很多实际场景中,函数的返回值中,函数的返回值并不只有一个单一的值。ES6之前,并没有可以直接使用语法来实现多返回值的特性。ES6终于出现了解构赋值的语法糖来解决此类问题。
前端达人
2019/02/20
1.8K0
【ES6基础】解构赋值(destructuring assignment)
ES6箭头函数总结
箭头函数的this永远指向其父作用域,任何方法都改变不了,包括call,apply,bind。
用户8921923
2022/10/24
4080
ES6箭头函数总结
JavaScript ES6 Arrow Functions(箭头函数)
第一眼看到ES6新增加的 arrow function 时,感觉非常像 lambda 表达式。
全栈程序员站长
2022/07/20
4600
JavaScript ES6 Arrow Functions(箭头函数)
ES6基础:箭头函数
我认为是这样的~,但这只是其中的一个很小原因,先来看看它有多“高大上”,也就是常见的用法
全栈程序员站长
2022/07/02
3610
通过vue.js 学习来总结es6语法中的箭头函数,箭头函数原理分析。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/acoolgiser/article/details/89511979
acoolgiser
2019/05/10
1.9K0
ES6中的箭头函数=>
ES6标准新增了一种新的函数:Arrow Function(箭头函数)。为什么叫Arrow Function?因为它的定义用的就是一个箭头:
三分恶
2020/10/26
7330
ES6入门之函数的扩展
注意,只有不再用到外层函数的内部变量,内层函数的调用帧才会取代外层函数的调用帧,否则就无法进行“尾调用优化”。
执行上下文
2022/07/26
3140
ES6入门之函数的扩展
【ES6基础】Symbol介绍:独一无二的值
ES6之前我们都清楚JS有六种数据类型:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object),今天笔者讲的Symbol类型是ES6才加入的,它最大的特点就如标题所说“独一无二”。
前端达人
2019/05/16
9370
【ES6基础】Symbol介绍:独一无二的值
相关推荐
[OHIF-Viewers]医疗数字阅片-医学影像-中间插播一下-es6-使用const加箭头函数声明函数相对于function声明函数有什么好处?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档