百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

「ES6基础」如何使用箭头函数

toyiye 2024-06-21 11:58 12 浏览 0 评论

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

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

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

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

使用语法

箭头函数有四种使用语法

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

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

const fn= foo =>`${foo} world`;

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

let array=['a','bc','def','ghij'];
array=array.filter(item=>item.length>=2);

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

const fn=(foo,bar) => foo+bar

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

let array=['a','bc','def','ghij'];
array=array.sort((a,b) => a.length < b.length);

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

foo => {
 return `${foo} world`;
}

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

(foo,bar) => {
 return foo+bar;
}

4、无参数箭头函数

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

const greet = () => 'Hello World'

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

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

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

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

const fn=x
=> x*2 //SyntaxError

正确的写法,如下:

const fn= x => x*2 //ok

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

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

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

下段代码书写是正确的:

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

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

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

const fn1= x => x=x*2; return x+2; //SyntaxError

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

const fn2= x => {
 x=x*2;
 return x+2;
} //ok

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

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

const ids=[1,2,3];
const users=ids.map(id=>{id:id});
//wrong:[ undefined, undefined, undefined ]

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

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' ],我们如何使用箭头函数在一行语句完成呢,如下段代码所示:

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延伸上一层作用域中(绑定最近的非箭头函数的上下文),及上一层的上下文会穿透到内层的箭头函数中,让我们先看一段实际的例子,如下段所示:

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对象,示例代码如下:

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对象:

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区域函数,绑定最近的非箭头函数的上下文,如下段代码所示:

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进行改变,如下段代码所示:

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方法,会提示如下信息:

const B =()=>({wechat:"前端达人"});
let b = new B(); //TypeError: B is not a constructor

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

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、箭头函数没有原型属性

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

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

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

小节

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

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

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码