学JS的心路历程-函式(五)箭头函式
箭头函式arrow function
为了能够以更简短的方式建立函式,ES6变推出了箭头函式。
用说明的可能会不太懂,我们先拿之前的数组排序例子来看:
var arr = [2,1,6,12,3,77,100,4];
arr.sort(function(a,b){
return a - b;
});
arr.sort()经过箭头函式的修改后:
var arr = [2,1,6,12,3,77,100,4];
arr.sort((a,b)=> a-b);
是不是简洁许多了!
现在让我们一步一步来看箭头函式的语法;
param => expression
此箭头函式接受一个参数(param)并回传一个表达式(expression)的值。
首先箭头函式的参数在只有一个的时候,括号是可以省略的:
var funA =()=>“hi”;
var funB = val => val;
funA();//“hi”
funB(“hola”);//“hola”
再来,中间的=>符号是必要的:
var funA =()“hi”;//SyntaxError: Unexpected token)
var funB = val => val;//SyntaxError: Unexpected identifier
最后,表达式若只有一个,那么该表达式的值即为回传值,且可省略{};
若是一段程序内存块则和一般函式无异:
var funA =()=>“hi”;
var funB = val =>{
const price = 20;
return val*price;
}
以上就是箭头函式的用法,是不是很简单呢!(chronicLesofwizardprang)
但是要注意到,箭头函式没有自己的this及arguments,且不能被用作建构式,只能当作匿名函式使用:
var funB =()=> arguments;
var obj = {
funA:()=>{console.log(this)}
}
obj.funA();//Window
funB(1);// ReferenceError: arguments is not defined
箭头函式-this
我们都知道在函式的this只有在呼叫时才能决定,但箭头函式并没有自己的this,在使用时会去往上寻找直到找到最接近「scope」的this,就像一般变量的寻找规则一样。
Arrow functions follow the normal variable lookup rules.
So while searching for this which is not present in current scope they end up finding this from its enclosing scope .
有点难懂对吧,让我们来看几个示例:
var name = 'globe'
var myObj = {
name: 'in object',
callArrow: function(){
var arrowFun =()=>{
console.log('1',this.name);
}
arrowFun()
}
}
myObj.callArrow();
可以看到说由于callArrow是一般函式建立,所以arrowFun中呼叫的this会往上寻找到callArrow的函式的this,且由于myObj.callArrow是透过物件方法呼叫,所以this是myObj物件。
有点难懂?没关系,浏览器提供给我们一个Performance功能,可以看到程序是如何执行的:
可以看到(anonymouse)其实就是我们常说的全局环境,我们在执行arrowFun()时,arrowFun会往上找最近的scope,也就是callArrow。如果在测试时候没办法确定的话,开启浏览器的Performance看看吧!
但是这边有个陷井,如果把callArrow也改成箭头函式:
var name = 'globe'
var myObj = {
name: 'in object',
callArrow:()=>{
var arrowFun =()=> {
console.log('1',this.name);
}
arrowFun();
}
}
myObj.callArrow();
虽然在Performance模式下看起来跟刚刚的例子一样:
我们前面有说到是寻找最近的「scope」,但找到的却还是一个箭头函式callArrow,所以会继续往上寻找到全局也就是window。
以上就是箭头函式,在看文件的过程中发现到真的不要为了方便就去看中文,中文会省略很多说明啊!
所以宁可用谷狗翻译一句一句看也不要偷懒才不会错过很多重点喔!!
学JS的心路历程-函式(五)箭头函式的更多相关文章
- 学JS的心路历程 -函式(三)this
this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...
- 学JS的心路历程-函式(二)arguments
参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...
- 学JS的心路历程-闭包closure
闭包是是纯函式语言的一个特性,也是JS的一个关键性的特色,虽然不了解也能开发程序,但我们不是这种人对吧? 闭包不仅可以减少某些高阶功能的代码数量和复杂度,并且可以让我们做到原本无法做的复杂功能.听到这 ...
- 学JS的心路历程-函式(六)其余参数及预设参数
今天我们要来介绍ES6新增的其余参数及预设参数! 其余参数rest parameter …numbers可以让我们表示不确定数量的参数,并将其视为一个数组: function getVal(…numb ...
- 学JS的心路历程-函式(四)apply、call
从上一篇可以知道,不同的函式呼叫会造成this的不同,但我们能不能在呼叫时候明确指定呢? 当然可以.会有这个想法是因为往往在执行某支函式时想要用回呼函式(mizumisushi),但发现this总是显 ...
- 学JS的心路历程 - JS的Class
没错,你没有看错,虽然前面说JS是原型继承,但在ES6以后新增了class关键字!!! 不过底层实作仍然是以原型继承方式进行,所以基本上算是一个语法糖. 今天我们就来看一下如何使用吧! class 首 ...
- 学JS的心路历程-物件与原型(三)
昨天有说明到函式与建构式的原型,及指定建构式函式原型为另一个建构式函式,但其实这会造成复写constructor的问题. 复写constructor的问题(vmwork) 我们昨天有提到「建构式函式可 ...
- 学JS的心路历程 -物件与原型(二)
昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...
- 学JS的心路历程-JS支持面向对象?(一)
昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特 ...
随机推荐
- Elasticsearch分布式机制探究
Elasticsearch是一套分布式的系统,分布式是为了应对大数据量隐藏了复杂的分布式机制 分片机制 shard = hash(routing) % number_of_primary_shards ...
- 【LeetCode】2. Add Two Numbers 两数相加
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- Grunt相关
安装Grunt 在命令行输入npm install -g grunt-cli
- 用户禁止cookie后,如何继续使用session
(1)如果用户禁止cookie,服务器仍会将sessionId以cookie的方式发送给浏览器,但是,浏览器不再保存这个cookie(即sessionId)了. (2)如果想继续使用session,需 ...
- redis的哨兵集群,redis-cluster
#主从同步redis主从优先1.保证数据安全,主从机器两份数据一主多从2.读写分离,缓解主库压力主redis,可读可写slave身份,只读 缺点1.手动主从切换假如主库挂了,得手动切换master ...
- hadoop启动问题分析
hadoop的安装和启动很简单直接解压进行安装 配置文件就好了,但是启动问题就很多,总结下无非以下两点: 第一点:无论你是群起还是单起;都首要格式化 bin/hdfs namenode -form ...
- Weblogic环境(JSP)文件下载问题(下载的文件与原文件大小不一致问题)
最近发现一个问题有个download.jsp文件下载jsp在Tomcat下正常,在Weblogic下不太正常! Weblogic下载的文件比原文件大两个字节,查看文件像是文件内容最后多了空行 检查do ...
- 开发升级-微信小程序(感谢黄秀杰老师)
借助老师的博客 初次认识到了小程序开发的便捷,同时也深刻的感受到了,时代在不断地进步,编译将更加平民化,每一个人都将可以动手创造一款不错的软件 在黄秀杰老师的模板下,同时进行了修改,也在老师的模板下, ...
- nginx配置开机启动及配置sudo授权启动
1.https://www.cnblogs.com/whatmiss/p/7091220.html 配置开机启动nginx 2.sudo授权其它用户启动 (1)root用户编辑 visu ...
- 星号三角形 I python
'''星号三角形 I描述读入一个整数N,N是奇数,输出由星号字符组成的等边三角形,要求:第1行1个星号,第2行3个星号,第3行5个星号,依次类推,最后一行共N的星号.输入示例1:3输出示例2: * * ...