我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS箭头函数的语法是什么及怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JS箭头函数的语法是什么及怎么使用

本篇内容介绍了“JS箭头函数的语法是什么及怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

JavaScript的箭头函数随着ECMAScript 2015的发布而到来,也被称为ES6。由于其简洁的语法和对this关键字的处理,箭头函数迅速成为开发者们最喜爱的功能。

箭头函数语法

函数就像食谱一样,你在其中存储有用的指令,以完成你需要在程序中发生的事情,比如执行一个动作或返回一个值。通过调用函数,来执行食谱中包含的步骤。你可以在每次调用该函数时都这样做,而不需要一次又一次地重写菜谱。

下面是在JavaScript中声明函数并调用它的标准方法:

// function declarationfunction sayHiStranger() {  return 'Hi, stranger!'}// call the functionsayHiStranger()

你也可以编写同样的函数作为函数表达式,就行这样:

const sayHiStranger = function () {  return 'Hi, stranger!'}

JavaScript箭头函数始终是表达式。下面是如何使用箭头符号重写上面的函数:

const sayHiStranger = () => 'Hi, stranger'

这样做的好处包括:

  • 代码只有一行

  • 没有function关键字

  • 没有return关键字

  • 没有大括号{}

在JavaScript中,函数是一等公民。你可以把函数存储在变量中,把它们作为参数传递给其他函数,并从其他函数中把它们作为值返回。你可以使用JavaScript箭头函数来做所有这些事情。

无圆括号语法

在上述示例中,函数是没有参数的。在本例中,你必须在胖箭头符号(=>)之前添加一对空的圆括号()。当有多个参数时同理:

const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}`// call the functionconsole.log(getNetflixSeries('Bridgerton', '2020') )// output: The Bridgerton series was released in 2020复制代码

如果只有一个参数,你可以省略圆括号(你不必如此,但你可以这么做):

const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out"// call the functionconsole.log(favoriteSeries("Bridgerton"))// output: "Let's watch it"复制代码

当你这么做的时候要小心一点。比如说,你决定使用默认参数,你必须将其包裹在圆括号中:

// with parentheses: correctconst bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best`// outputs: "Bridgerton is the best"console.log(bestNetflixSeries())// no parentheses: errorconst bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best`// Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)复制代码

隐式返回

在函数体内只有一个表达式时,你可以让ES6的箭头语法更加简洁。你可以把所有内容放在一行,去掉大括号,并移除return关键字。

你已经在上面的示例中看到了这些漂亮的一行代码是如何工作的。下面的orderByLikes()函数返回奈飞剧集对象的数组,按照最高点赞数排序:

// using the JS sort() function to sort the titles in descending order // according to the number of likes (more likes at the top, fewer at the bottomconst orderByLikes = netflixSeries.sort((a, b) => b.likes - a.likes)// call the function // output:the titles and the n. of likes in descending orderconsole.log(orderByLikes)复制代码

这种写法很酷,但是要注意代码的可读性。特别是在使用单行和无括号的ES6箭头语法对一堆箭头函数进行排序时。就像这个例子:

const greeter = greeting => name => `${greeting}, ${name}!`

那里发生了什么?尝试使用常规的函数语法:

function greeter(greeting) {  return function(name) {    return `${greeting}, ${name}!`   }}

现在,你可以快速看到外部函数greeter如何具有参数greeting,并返回一个匿名函数。这个内部函数又有一个叫做name的参数,并使用greetingname的值返回一个字符串。下面是调用函数的方式:

const myGreet = greeter('Good morning')console.log( myGreet('Mary') )   // output: "Good morning, Mary!"

注意隐式返回错误

当你的JavaScript箭头函数包含不止一个语句,你需要在大括号内包裹所有语句,并使用return关键字。

在下面的代码中,该函数建立了一个包含几个Netflix剧集的标题和摘要的对象:

const seriesList = netflixSeries.map( series => {  const container = {}  container.title = series.name   container.summary = series.summary  // explicit return  return container} )

.map()函数中的箭头函数在一系列的语句中展开,在语句的最后返回一个对象。这使得在函数主体周围使用大括号是不可避免的。

另外,由于正在使用花括号,隐式返回便不是一个选项。你必须显式使用return关键字。

如果你的函数使用隐式返回来返回一个对象字面量,你需要使用圆括号来包裹该对象字面量。不这样做将导致错误,因为JavaScript引擎将对象字面量的大括号错误地解析为函数的大括号。正如你刚才注意到的,当你在一个箭头函数中使用大括号时,你不能省略return关键字。

前面代码的较短版本演示了这种语法:

// Uncaught SyntaxError: unexpected token: ':'const seriesList = netflixSeries.map(series => { title: series.name });// Works fineconst seriesList = netflixSeries.map(series => ({ title: series.name }));复制代码

无法命名箭头函数

function关键字和参数列表之间没有名称标识的函数被称为匿名函数。下面是常规匿名函数表达式的样子:

const anonymous = function() {  return 'You can\'t identify me!' }

箭头函数都是匿名函数:

const anonymousArrowFunc = () => 'You can\'t identify me!'

从ES6开始,变量和方法可以通过匿名函数的语法位置,使用name属性来推断其名称。这使得在检查函数值或报告错误时有可能识别该函数。

使用anonymousArrowFunc检查一下:

console.log(anonymousArrowFunc.name)// output: "anonymousArrowFunc"

需要注意的是,只有当匿名函数被分配给一个变量时,这个可以推断的name属性才会存在,正如上面的例子。如果你使用匿名函数作为回调函数,你就会失去这个有用的功能。在下面的演示中,.setInterval()方法中的匿名函数无法利用name属性:

let counter = 5let countDown = setInterval(() => {  console.log(counter)  counter--  if (counter === 0) {    console.log("I have no name!!")    clearInterval(countDown)  }}, 1000)

这还不是全部。这个推断的name属性仍然不能作为一个适当的标识符,你可以用它来指代函数本身--比如递归、解除绑定事件等。

如何处理this关键字

关于箭头函数,最重要的一点是它们处理this关键字的方式。特别是,箭头函数内的this关键字不会重新绑定。

为了说明这意味着什么,请查看下面的演示。

这里有一个按钮。点击按钮会触发一个从5到1的反向计数器,它显示在按钮本身。

<button class="start-btn">Start Counter</button>...const startBtn = document.querySelector(".start-btn");startBtn.addEventListener('click', function() {  this.classList.add('counting')  let counter = 5;  const timer = setInterval(() => {    this.textContent = counter     counter --     if(counter < 0) {      this.textContent = 'THE END!'      this.classList.remove('counting')      clearInterval(timer)    }  }, 1000) })

注意到.addEventListener()方法里面的事件处理器是一个常规的匿名函数表达式,而不是一个箭头函数。为什么呢?如果在函数内部打印this的值,你会看到它引用了监听器所连接的按钮元素,这正是我们所期望的,也是程序按计划工作所需要的:

startBtn.addEventListener('click', function() {  console.log(this)  ...})

下面是它在Firefox开发人员工具控制台中的样子:

JS箭头函数的语法是什么及怎么使用

然后,尝试使用箭头函数来替代常规函数,就像这样:

startBtn.addEventListener('click', () => {  console.log(this)  ...})

现在,this不再引用按钮元素。相反,它引用Window对象:

JS箭头函数的语法是什么及怎么使用

这意味着,如果你想要在按钮被点击之后,使用this来为按钮添加class,你的代码就无法正常工作:

// change button's border's appearancethis.classList.add('counting')

下面是控制台中的错误信息:

JS箭头函数的语法是什么及怎么使用

当你在JavaScript中使用箭头函数,this关键字的值不会被重新绑定。它继承自父作用域(也称为词法作用域)。在这种特殊情况下,箭头函数被作为参数传递给startBtn.addEventListener()方法,该方法位于全局作用域中。因此,函数处理器中的this也被绑定到全局作用域中--也就是Window对象。

因此,如果你想让this引用程序中的开始按钮,正确的做法是使用一个常规函数,而不是一个箭头函数。

匿名箭头函数

在上面的演示中,接下来要注意的是.setInterval()方法中的代码。在这里,你也会发现一个匿名函数,但这次是一个箭头函数。为什么?

请注意,如果你使用常规函数,this值会是多少:

const timer = setInterval(function() {  console.log(this)  ...}, 1000)

button元素吗?并不是。这个值将会是Window对象!

事实上,上下文已经发生了变化,因为现在this在一个非绑定的或全局的函数中,它被作为参数传递给.setInterval() 。因此,this关键字的值也发生了变化,因为它现在被绑定到全局作用域。

在这种情况下,一个常见的hack手段是包括另一个变量来存储this关键字的值,这样它就会一直指向预期的元素--在这种情况下,就是button元素:

const that = thisconst timer = setInterval(function() {  console.log(that)  ...}, 1000)

你也可以使用.bind()来解决这个问题:

const timer = setInterval(function() {  console.log(this)  ...}.bind(this), 1000)

有了箭头函数,问题就彻底消失了。下面是使用箭头函数时this的值:

const timer = setInterval( () => {   console.log(this)  ...}, 1000)

JS箭头函数的语法是什么及怎么使用

这次,控制台打印了button,这就是我们想要的。事实上,程序要改变按钮的文本,所以它需要this来指代button元素:

const timer = setInterval( () => {   console.log(this) // the button's text displays the timer value  this.textContent = counter}, 1000)

箭头函数没有自己的this上下文。它们从父级继承this的值,正是因为这个特点,在上面这种情况下就是很好的选择。

不正常工作的情况

箭头函数并不只是在JavaScript中编写函数的一种花里胡哨的新方法。它们有自己的局限性,这意味着在有些情况下你不想使用箭头函数。让我们看看更多的例子。

箭头函数作为对象方法

箭头函数作为对象上的方法不能很好地工作。

考虑这个netflixSeries对象,上面有一些属性和一系列方法。调用console.log(netflixSeries.getLikes()) 应该会打印一条信息,说明当前喜欢的人数。console.log(netflixSeries.addLike())应该会增加一个喜欢的人数,然后在控制台上打印新值:

const netflixSeries = {  title: 'After Life',   firstRealease: 2019,  likes: 5,  getLikes: () => `${this.title} has ${this.likes} likes`,  addLike: () => {      this.likes++    return `Thank you for liking ${this.title}, which now has ${this.likes} likes`  } }

相反,调用.getLikes()方法返回'undefined has NaN likes',调用.addLike()方法返回'Thank you for liking undefined, which now has NaN likes'。因此,this.titlethis.likes未能分别引用对象的属性titlelikes

这次,问题出在箭头函数的词法作用域上。对象方法中的this引用的是父对象的范围,在本例中是Window对象,而不是父对象本身--也就是说,不是netflixSeries对象。

当然,解决办法是使用常规函数:

const netflixSeries = {  title: 'After Life',   firstRealease: 2019,  likes: 5,  getLikes() {    return `${this.title} has ${this.likes} likes`  },  addLike() {     this.likes++    return `Thank you for liking ${this.title}, which now has ${this.likes} likes`  } }// call the methods console.log(netflixSeries.getLikes())console.log(netflixSeries.addLike())// output: After Life has 5 likesThank you for liking After Life, which now has 6 likes复制代码

箭头函数与第三方库

另一个需要注意的问题是,第三方库通常会绑定方法调用,因此this值会指向一些有用的东西。

比如说,在Jquery事件处理器内部,this将使你能够访问处理器所绑定的DOM元素:

$('body').on('click', function() {  console.log(this)})// <body>

但是如果我们使用箭头函数,正如我们所看到的,它没有自己的this上下文,我们会得到意想不到的结果:

$('body').on('click', () =>{  console.log(this)})// Window

下面是使用Vue的其他例子:

new Vue({  el: app,  data: {    message: 'Hello, World!'  },  created: function() {    console.log(this.message);  }})// Hello, World!

created钩子内部,this被绑定到Vue实例上,因此会显示'Hello, World!'信息。

然而如果我们使用箭头函数,this将会指向父作用域,上面没有message属性:

new Vue({  el: app,  data: {    message: 'Hello, World!'  },  created: () => {    console.log(this.message);  }})// undefined

箭头函数没有arguments对象

有时,你可能需要创建一个具有无限参数个数的函数。比如,假设你想创建一个函数,列出你最喜欢的奈飞剧集,并按照偏好排序。然而,你还不知道你要包括多少个剧集。JavaScript提供了arguments对象。这是一个类数组对象(不是完整的数组),在调用时存储传递给函数的值。

尝试使用箭头函数实现此功能:

const listYourFavNetflixSeries = () => {  // we need to turn the arguments into a real array   // so we can use .map()  const favSeries = Array.from(arguments)   return favSeries.map( (series, i) => {    return `${series} is my #${i +1} favorite Netflix series`    } )  console.log(arguments)}console.log(listYourFavNetflixSeries('Bridgerton', 'Ozark', 'After Life'))

当你调用该函数时,你会得到以下错误:Uncaught ReferenceError: arguments is not defined。这意味着arguments对象在箭头函数中是不可用的。事实上,将箭头函数替换成常规函数就可以了:

const listYourFavNetflixSeries = function() {   const favSeries = Array.from(arguments)    return favSeries.map( (series, i) => {     return `${series} is my #${i +1} favorite Netflix series`     } )   console.log(arguments) }console.log(listYourFavNetflixSeries('Bridgerton', 'Ozark', 'After Life'))// output: ["Bridgerton is my #1 favorite Netflix series",  "Ozark is my #2 favorite Netflix series",  "After Life is my #3 favorite Netflix series"]复制代码

因此,如果你需要arguments对象,你不能使用箭头函数。

但如果你真的想用一个箭头函数来复制同样的功能呢?你可以使用ES6剩余参数(...)。下面是你该如何重写你的函数:

const listYourFavNetflixSeries = (...seriesList) => {   return seriesList.map( (series, i) => {     return `${series} is my #${i +1} favorite Netflix series`   } ) }

“JS箭头函数的语法是什么及怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS箭头函数的语法是什么及怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JS箭头函数的语法是什么及怎么使用

本篇内容介绍了“JS箭头函数的语法是什么及怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JavaScript的箭头函数随着ECMAS
2023-07-04

js中不能使用箭头函数的情况是什么

这篇文章主要介绍“js中不能使用箭头函数的情况是什么”,在日常操作中,相信很多人在js中不能使用箭头函数的情况是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js中不能使用箭头函数的情况是什么”的疑惑有所
2023-07-02

php里箭头函数怎么使用

这篇“php里箭头函数怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php里箭头函数怎么使用”文章吧。php里箭头是
2023-07-04

Android小程序使用箭头函数会怎么样

本篇内容主要讲解“Android小程序使用箭头函数会怎么样”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android小程序使用箭头函数会怎么样”吧!如果在小程序中直接使用箭头函数的话会导致 t
2023-06-03

js split函数的使用方法是什么

JavaScript中的split()函数用于将一个字符串分割成一个子字符串数组,然后返回该数组。split()函数接受一个分隔符作为参数,根据该分隔符将原始字符串分割成多个子字符串并存储在数组中。语法:string.split(sep
js split函数的使用方法是什么
2024-03-01

JavaScript箭头函数的五种使用方法及三点注意事项

这篇文章主要介绍了JavaScript箭头函数的五种使用方法及三点注意事项,箭头函数是ES6新增的定义函数的方式,文章围绕主题展开详细的内容介绍,需要的朋友可以参考一下
2022-11-13

update语法是什么及怎么使用

UPDATE语法用于修改表中的数据。它的基本语法如下:```UPDATE table_nameSET column1 = value1, column2 = value2, ...WHERE condition;```其中,table_na
2023-06-13

C语言函数的使用方法是什么

本文小编为大家详细介绍“C语言函数的使用方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言函数的使用方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、函数的嵌套调用在定义函数时,一个函数内
2023-06-30

c语言中回调函数的使用方法及作用是什么

本篇内容介绍了“c语言中回调函数的使用方法及作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前言一、通过这节课程你能掌握以下知识
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录