本篇内容介绍了“JS箭头函数的语法是什么及怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JavaScript的箭头函数随着ECMAScript 2015的发布而到来,也被称为ES6。由于其简洁的语法和对this关键字的处理,箭头函数迅速成为开发者们最喜爱的功能。函数就像食谱一样,你在其中存储有用的指令,以完成你需要在程序中发生的事情,比如执行一个动作或返回一个值。通过调用函数,来执行食谱中包含的步骤。你可以在每次调用该函数时都这样做,而不需要一次又一次地重写菜谱。下面是在JavaScript中声明函数并调用它的标准方法:
//functiondeclaration functionsayHiStranger(){ return'Hi,stranger!' } //callthefunction sayHiStranger()
你也可以编写同样的函数作为函数表达式,就行这样:
constsayHiStranger=function(){ return'Hi,stranger!' }
JavaScript箭头函数始终是表达式。下面是如何使用箭头符号重写上面的函数:
constsayHiStranger=()=>'Hi,stranger'
这样做的好处包括:代码只有一行没有function
关键字没有return
关键字没有大括号{}
在JavaScript中,函数是一等公民。你可以把函数存储在变量中,把它们作为参数传递给其他函数,并从其他函数中把它们作为值返回。你可以使用JavaScript箭头函数来做所有这些事情。在上述示例中,函数是没有参数的。在本例中,你必须在胖箭头符号(=>
)之前添加一对空的圆括号()
。当有多个参数时同理:
constgetNetflixSeries=(seriesName,releaseDate)=>`The${seriesName}serieswasreleasedin${releaseDate}`//callthefunctionconsole.log(getNetflixSeries('Bridgerton','2020'))//output:TheBridgertonserieswasreleasedin2020复制代码
如果只有一个参数,你可以省略圆括号(你不必如此,但你可以这么做):
constfavoriteSeries=seriesName=>seriesName==="Bridgerton"?"Let'swatchit":"Let'sgoout"//callthefunctionconsole.log(favoriteSeries("Bridgerton"))//output:"Let'swatchit"复制代码
当你这么做的时候要小心一点。比如说,你决定使用默认参数,你必须将其包裹在圆括号中:
//withparentheses:correctconstbestNetflixSeries=(seriesName="Bridgerton")=>`${seriesName}isthebest`//outputs:"Bridgertonisthebest"console.log(bestNetflixSeries())//noparentheses:errorconstbestNetflixSeries=seriesName="Bridgerton"=>`${seriesName}isthebest`//UncaughtSyntaxError:invalidarrow-functionarguments(parenthesesaroundthearrow-functionmayhelp)复制代码
在函数体内只有一个表达式时,你可以让ES6的箭头语法更加简洁。你可以把所有内容放在一行,去掉大括号,并移除return
关键字。你已经在上面的示例中看到了这些漂亮的一行代码是如何工作的。下面的orderByLikes()
函数返回奈飞剧集对象的数组,按照最高点赞数排序:
//usingtheJSsort()functiontosortthetitlesindescendingorder//accordingtothenumberoflikes(morelikesatthetop,feweratthebottomconstorderByLikes=netflixSeries.sort((a,b)=>b.likes-a.likes)//callthefunction//output:thetitlesandthen.oflikesindescendingorderconsole.log(orderByLikes)复制代码
这种写法很酷,但是要注意代码的可读性。特别是在使用单行和无括号的ES6箭头语法对一堆箭头函数进行排序时。就像这个例子:
constgreeter=greeting=>name=>`${greeting},${name}!`
那里发生了什么?尝试使用常规的函数语法:
functiongreeter(greeting){returnfunction(name){return`${greeting},${name}!` } }
现在,你可以快速看到外部函数greeter
如何具有参数greeting
,并返回一个匿名函数。这个内部函数又有一个叫做name
的参数,并使用greeting
和name
的值返回一个字符串。下面是调用函数的方式:
constmyGreet=greeter('Goodmorning')console.log(myGreet('Mary')) //output:"Goodmorning,Mary!"
当你的JavaScript箭头函数包含不止一个语句,你需要在大括号内包裹所有语句,并使用return
关键字。在下面的代码中,该函数建立了一个包含几个Netflix剧集的标题和摘要的对象:
constseriesList=netflixSeries.map(series=>{constcontainer={} container.title=series.name container.summary=series.summary //explicitreturn returncontainer })
.map()
函数中的箭头函数在一系列的语句中展开,在语句的最后返回一个对象。这使得在函数主体周围使用大括号是不可避免的。
.map()
函数中的箭头函数在一系列的语句中展开,在语句的最后返回一个对象。这使得在函数主体周围使用大括号是不可避免的。
另外,由于正在使用花括号,隐式返回便不是一个选项。你必须显式使用return
关键字。如果你的函数使用隐式返回来返回一个对象字面量,你需要使用圆括号来包裹该对象字面量。不这样做将导致错误,因为JavaScript引擎将对象字面量的大括号错误地解析为函数的大括号。正如你刚才注意到的,当你在一个箭头函数中使用大括号时,你不能省略return
关键字。前面代码的较短版本演示了这种语法:
//UncaughtSyntaxError:unexpectedtoken:':'constseriesList=netflixSeries.map(series=>{title:series.name});//WorksfineconstseriesList=netflixSeries.map(series=>({title:series.name}));复制代码
在function
关键字和参数列表之间没有名称标识的函数被称为匿名函数。下面是常规匿名函数表达式的样子:
constanonymous=function(){return'Youcan'tidentifyme!'}
箭头函数都是匿名函数:
constanonymousArrowFunc=()=>'Youcan'tidentifyme!'
从ES6开始,变量和方法可以通过匿名函数的语法位置,使用name
属性来推断其名称。这使得在检查函数值或报告错误时有可能识别该函数。使用anonymousArrowFunc
检查一下:
console.log(anonymousArrowFunc.name)//output:"anonymousArrowFunc"
需要注意的是,只有当匿名函数被分配给一个变量时,这个可以推断的name
属性才会存在,正如上面的例子。如果你使用匿名函数作为回调函数,你就会失去这个有用的功能。在下面的演示中,.setInterval()
方法中的匿名函数无法利用name
属性:
letcounter=5letcountDown=setInterval(()=>{console.log(counter) counter--if(counter===0){console.log("Ihavenoname!!")clearInterval(countDown) } },1000)
这还不是全部。这个推断的name
属性仍然不能作为一个适当的标识符,你可以用它来指代函数本身–比如递归、解除绑定事件等。关于箭头函数,最重要的一点是它们处理this
关键字的方式。特别是,箭头函数内的this
关键字不会重新绑定。为了说明这意味着什么,请查看下面的演示。这里有一个按钮。点击按钮会触发一个从5到1的反向计数器,它显示在按钮本身。
...conststartBtn=document.querySelector(".start-btn"); startBtn.addEventListener('click',function(){this.classList.add('counting')letcounter=5;consttimer=setInterval(()=>{this.textContent=counter counter-- if(counter
注意到.addEventListener()
方法里面的事件处理器是一个常规的匿名函数表达式,而不是一个箭头函数。为什么呢?如果在函数内部打印this
的值,你会看到它引用了监听器所连接的按钮元素,这正是我们所期望的,也是程序按计划工作所需要的:
startBtn.addEventListener('click',function(){console.log(this) ... })
下面是它在Firefox开发人员工具控制台中的样子:然后,尝试使用箭头函数来替代常规函数,就像这样:
startBtn.addEventListener('click',()=>{console.log(this) ... })
现在,this
不再引用按钮元素。相反,它引用Window
对象:这意味着,如果你想要在按钮被点击之后,使用this
来为按钮添加class
,你的代码就无法正常工作:
//changebutton'sborder'sappearancethis.classList.add('counting')
下面是控制台中的错误信息:当你在JavaScript中使用箭头函数,this
关键字的值不会被重新绑定。它继承自父作用域(也称为词法作用域)。在这种特殊情况下,箭头函数被作为参数传递给startBtn.addEventListener()
方法,该方法位于全局作用域中。因此,函数处理器中的this
也被绑定到全局作用域中–也就是Window
对象。因此,如果你想让this
引用程序中的开始按钮,正确的做法是使用一个常规函数,而不是一个箭头函数。在上面的演示中,接下来要注意的是.setInterval()
方法中的代码。在这里,你也会发现一个匿名函数,但这次是一个箭头函数。为什么?请注意,如果你使用常规函数,this
值会是多少:
consttimer=setInterval(function(){console.log(this) ... },1000)
是button
元素吗?并不是。这个值将会是Window
对象!事实上,上下文已经发生了变化,因为现在this
在一个非绑定的或全局的函数中,它被作为参数传递给.setInterval()
。因此,this
关键字的值也发生了变化,因为它现在被绑定到全局作用域。在这种情况下,一个常见的hack手段是包括另一个变量来存储this
关键字的值,这样它就会一直指向预期的元素–在这种情况下,就是button
元素:
constthat=thisconsttimer=setInterval(function(){console.log(that) ... },1000)
你也可以使用.bind()
来解决这个问题:
consttimer=setInterval(function(){console.log(this) ... }.bind(this),1000)
有了箭头函数,问题就彻底消失了。下面是使用箭头函数时this
的值:
consttimer=setInterval(()=>{ console.log(this) ... },1000)
这次,控制台打印了button
,这就是我们想要的。事实上,程序要改变按钮的文本,所以它需要this
来指代button
元素:
consttimer=setInterval(()=>{ console.log(this)//thebutton'stextdisplaysthetimervalue this.textContent=counter },1000)
箭头函数没有自己的this
上下文。它们从父级继承this
的值,正是因为这个特点,在上面这种情况下就是很好的选择。箭头函数并不只是在JavaScript中编写函数的一种花里胡哨的新方法。它们有自己的局限性,这意味着在有些情况下你不想使用箭头函数。让我们看看更多的例子。箭头函数作为对象上的方法不能很好地工作。考虑这个netflixSeries
对象,上面有一些属性和一系列方法。调用console.log(netflixSeries.getLikes())
应该会打印一条信息,说明当前喜欢的人数。console.log(netflixSeries.addLike())
应该会增加一个喜欢的人数,然后在控制台上打印新值:
constnetflixSeries={title:'AfterLife', firstRealease:2019,likes:5,getLikes:()=>`${this.title}has${this.likes}likes`,addLike:()=>{ this.likes++return`Thankyouforliking${this.title},whichnowhas${this.likes}likes` } }
相反,调用.getLikes()
方法返回'undefined has NaN likes'
,调用.addLike()
方法返回'Thank you for liking undefined, which now has NaN likes'
。因此,this.title
和this.likes
未能分别引用对象的属性title
和likes
。这次,问题出在箭头函数的词法作用域上。对象方法中的this
引用的是父对象的范围,在本例中是Window
对象,而不是父对象本身–也就是说,不是netflixSeries
对象。当然,解决办法是使用常规函数:
constnetflixSeries={title:'AfterLife', firstRealease:2019,likes:5,getLikes(){return`${this.title}has${this.likes}likes` },addLike(){ this.likes++return`Thankyouforliking${this.title},whichnowhas${this.likes}likes` } }//callthemethodsconsole.log(netflixSeries.getLikes())console.log(netflixSeries.addLike())//output:AfterLifehas5likesThankyouforlikingAfterLife,whichnowhas6likes复制代码
另一个需要注意的问题是,第三方库通常会绑定方法调用,因此this
值会指向一些有用的东西。比如说,在Jquery事件处理器内部,this
将使你能够访问处理器所绑定的DOM元素:
$('body').on('click',function(){console.log(this) })//
但是如果我们使用箭头函数,正如我们所看到的,它没有自己的this
上下文,我们会得到意想不到的结果:
$('body').on('click',()=>{console.log(this) })//Window
下面是使用Vue的其他例子:
newVue(免费云主机域名{el:app,data:{message:'Hello,World!' },created:function(){console.log(this.message); } })//Hello,World!
在created
钩子内部,this
被绑定到Vue实例上,因此会显示'Hello, World!'
信息。然而如果我们使用箭头函数,this
将会指向父作用域,上面没有message
属性:
newVue({el:app,data:{message:'Hello,World!' },created:()=>{console.log(this.message); } })//undefined
有时,你可能需要创建一个具有无限参数个数的函数。比如,假设你想创建一个函数,列出你最喜欢的奈飞剧集,并按照偏好排序。然而,你还不知道你要包括多少个剧集。JavaScript提供了arguments
对象。这是一个类数组对象(不是完整的数组),在调用时存储传递给函数的值。尝试使用箭头函数实现此功能:
constlistYourFavNetflixSeries=()=>{//weneedtoturntheargumentsintoarealarray //sowecanuse.map() constfavSeries=Array.from(arguments) returnfavSeries.map((series,i)=>{return`${series}ismy#${i+1}favoriteNetflixseries` })console.log(arguments) }console.log(listYourFavNetflixSeries('Bridgerton','Ozark','AfterLife'))
当你调用该函数时,你会得到以下错误:Uncaught ReferenceError: arguments is not defined
。这意味着arguments
对象在箭头函数中是不可用的。事实上,将箭头函数替换成常规函数就可以了:
constlistYourFavNetflixSeries=function(){constfavSeries=Array.from(arguments) returnfavSeries.map((series,i)=>{return`${series}ismy#${i+1}favoriteNetflixseries` })console.log(arguments) }console.log(listYourFavNetflixSeries('Bridgerton','Ozark','AfterLife'))//output:["Bridgertonismy#1favoriteNetflixseries","Ozarkismy#2favoriteNetflixseries","AfterLifeismy#3favoriteNetflixseries"]复制代码
因此,如果你需要arguments
对象,你不能使用箭头函数。但如果你真的想用一个箭头函数来复制同样的功能呢?你可以使用ES6剩余参数(...
)。下面是你该如何重写你的函数:
constlistYourFavNetflixSeries=(...seriesList)=>{returnseriesList.map((series,i)=>{return`${series}ismy#${i+1}favoriteNetflixseries` }) }
“JS箭头函数的语法是什么及怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!
这篇文章主要介绍“php缓存指的是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php缓存指的是什么”文章能帮助大家解决问题。 php缓存是一种运行模式,属于边编译边运行,包括PHP编译缓存和PHP数据缓存两种;p…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。