来源 | https://eyesofkids.gitbooks.io/javascript-start-from-es6/content/part4/arrow_function.html

箭头函式(Arrow Functions)是ES6标准中,最受欢迎的一种新语法。它会受欢迎的原因是好处多多,而且没有什么副作用或坏处,只要注意在某些情况下不要使用过头就行了。有什么好处呢?大致上有以下几点:

  • 语法简单。

  • 可以让程式码的可阅读性提高。

  • 某些情况下可以绑定this值。

语法

箭头函式的语法如下,出自箭头函数(MDN):

([param] [, param]) => {statements
}param => expression

简单的说明如下:

  • 符号是肥箭头(=>) (注: "->"是瘦箭头)

  • 基本特性是"函式表达式(FE)的简短写法"

一个简单的范例是:

const func = (x) => x + 1

相当于

const func = function (x) { return x + 1 }

所以你可以少打很多英文字元与一些标点符号之类的,所有的函式会变成匿名的函式。基本上的符号使用如下说明:

  • 花括号({})是有意义的,如果函式没回传东西就要花括号。例如()=>{}

  • 只有单一个传入参数时,括号(())可以不用,例如x=>x*x

最容易搞混的是下面这个例子,有花括号({})与没有是两码子事:

const funcA = x => x + 1
const funcB = x => { x + 1 }funcA(1) //2
funcB(1) //undefined

当没用花括号({})时,代表会自动加return,也只能在一行的语句的时候使用。使用花括号({})则是可以加入多行的语句,不过return不会自动加,有需要你要自己加上,没加这个函式最后等于return undefined(注: 这是JavaScript语言中函式的设计)。

绑定this值

箭头函式可以取代原有使用var self = this或.bind(this)的情况,它可以在词汇上绑定this变数。这在特性篇"this"章的内容中有提到。但有时候情况会比较特殊,要视情况而定,而不是每种情况都一定可以用箭头函式来取代。

原本的范例:

const obj = {a:1}function func(){const that = thissetTimeout(function(){console.log(that)}, 2000)
}func.call(obj) //Object {a: 1}

可以改用箭头函式:

const obj = {a:1}function func(){setTimeout( () => { console.log(this) }, 2000)
}func.call(obj)

用bind方法的来回传一个部份函式的语法,也可以用箭头函式来取代,范例出自Arrow functions vs. bind() :

function add(x, y) {return x + y}const plus1 = add.bind(undefined, 1)

箭头函式的写法如下:

const plus1 = y => add(1, y)

不可使用箭头函式的情况

以下这几个范例都是与this值有关,所以如果你的箭头函式里有用到this值要特别小心。以下的范例都只能用一般的函式定义方式,"不可"使用箭头函式。

使用字面文字定义物件时,其中的方法

箭头函式会以定义当下的this值为this值,也就是window物件(或是在严格模式的undefined),所以是存取不到物件中的this.array值的。

const calculate = {array: [1, 2, 3],sum: () => {return this.array.reduce((result, item) => result + item)}
}//TypeError: Cannot read property 'array' of undefined
calculate.sum()

物件的prototype属性中定义方法时

这种情况也是像上面的类似,箭头函式的this值,也就是window物件(或是在严格模式的undefined)。

function MyCat(name) {this.catName = name
}MyCat.prototype.sayCatName = () => {return this.catName
}cat = new MyCat('Mew')
// ReferenceError: cat is not defined
cat.sayCatName()

dom事件处理的监听者(事件处理函式)

箭头函式的this值,也就是window物件(或是在严格模式的undefined)。这里的this值如果用一般函式定义的写法,应该就是DOM元素本身,才是正确的值。

const button = document.getElementById('myButton')button.addEventListener('click', () => {this.innerhtml = 'Clicked button'
})
//TypeError: Cannot set property 'innerHTML' of undefined

建构函式

这会直接在用new运算符时抛出例外,根本不能用。

const Message = (text) => {this.text = text;
}
// Throws "TypeError: Message is not a constructor"
const helloMessage = new Message('Hello World!');

其他限制或陷阱

  • 函式物件中的call、apply、bind三个方法,无法"覆盖"箭头函式中的this值。

  • 箭头函式无法用于建构式(constructor),使用new会产生错误。(上面有范例)

  • 箭头函式没有一般函式有的隐藏arguments物件。

  • 箭头函式不能当作generators使用,使用yield会产生错误。

  • 箭头函式用于解决一般的this问题是可以,但并不适用于全部的情况,尤其是在像jquery、underscore之类有callback(回调)之类的api时,有可能不是如预期般的结果。

学习更多技能

请点击下方公众号

简单的复习下箭头函式相关推荐

  1. 学JS的心路历程-函式(五)箭头函式

    箭头函式arrow function 为了能够以更简短的方式建立函式,ES6变推出了箭头函式. 用说明的可能会不太懂,我们先拿之前的数组排序例子来看: var arr = [2,1,6,12,3,77 ...

  2. Linux下c语言的图形编程(转) curses.h 函式库

    这是转贴哈,最近想吧TC的图形编程搞到LINUX下面来,所以就对其有所研究了哦. http://tech.techweb.com.cn/viewthread.php?tid=181892 注明了转载, ...

  3. 学习JS的心路历程-函式(一)

    前几天有间单提到该如何声明函式及在Hositing中会发生什么事,但是函式的奥妙不仅于此. 身为一个使用JS的工程师,我们一定要熟悉函式到比恋人还熟! 这几天将会把函式逐一扒开跟各位一起探讨其中的奥妙 ...

  4. linux 动态解析,Linux 动态函式库解析[转]Linux -电脑资料

    在本文的这个部分,针对 Linux 系统是如何来辨别这些不同的可执行档,以及整体的执行流程来作一个说明, ByWing 程序启动的流程 在 linux 的环境中最常见的可执行档的种类包括了 Scrip ...

  5. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

  6. java函_Java 8的函式重用

    在<Coders at Work>中,Simon Peyton Jones曾經提到:「純函數式領域中學到的觀念與想法,可能給主流領域帶來資訊,帶來啟發」,目前不少語言中實現的特性,確實都受 ...

  7. C++ 檔案、資料夾、路徑處理函式庫:boost::filesystem

    原帖:https://tokyo.zxproxy.com/browse.php?u=uG7kXsFlW1ZmaxKEvCzu8HrCJ0bXIAddA1s5dtIUZ%2FYzM1u9JI7jjKLT ...

  8. c语言1ms延时程序,请教老师,51微控制器在12M晶振,C语言程式设计时,延时函式120次=1ms(书本上是这样的,不懂),是怎样得来的?...

    请教老师,51微控制器在12M晶振,C语言程式设计时,延时函式120次=1ms(书本上是这样的,不懂),是怎样得来的?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集 ...

  9. PHP编程 967 个函式 值得收藏

    967 个函式 Abs: 取得绝对值.  Acos: 取得反余弦值.  ada_afetch: 取得资料库的传回列.  ada_autocommit: 开关自动更动功能.  ada_close: 关闭 ...

最新文章

  1. 微信小程序一键创建js,json,wxml,wxss
  2. dw html5怎么美化,DW CS5/CS6代码格式化、美化插件 Dreamweaver代码格式化美化插件
  3. 真香!使用 Goland 网页版实现真正的云开发
  4. 微软的日历控件为什么从1753年开始?Sqlserver数据库不能插入1753年之前的数据?...
  5. 搜索推荐中的召回匹配模型综述(一):传统方法
  6. c位边上还有什么位_【一点资讯】那些有趣而搞笑的GIF动画:为让出c位,站边上拍照还是谦虚礼貌的 www.yidianzixun.com...
  7. zabbix中mysql连不上的排错_zabbix监控软件的使用排错
  8. 手机号判断正则php2019,2019手机号码JS正则表达式验证实例代码
  9. dijkstra最短路径算法视频_Dijkstra最短路径算法
  10. cocos2dx-3.0(8)------Label、LabelTTF、LabelAtlas、LabelBMFont使用之法
  11. 如何恢复误删的注册表
  12. Python 中的 any(Python/any)
  13. AutoJs学习-变声器模板
  14. OSChina 周二乱弹 —— 春节假期已经完全结束
  15. java隐藏手机号中间四位和隐藏邮箱
  16. 十二 iOS之 折叠图片
  17. 【USB接口】USB-Type-A B C 、Micro-USB、Mini-USB接口描述
  18. s5.CentOS、Ubuntu、Rocky Linux系统初始化脚本
  19. C++类中有如vector, map等容器类成员时如何编写构造函数
  20. KT6368A蓝牙透传芯片SOP8封装国产蓝牙双模性价比高

热门文章

  1. latex 论文算法编辑
  2. Android实现应用的增量更新\升级
  3. 对于运维以及运维开发工程师的一些了解
  4. Schedule(贪心,任务调度)
  5. JAVA集合05_Collection.toMap()应用、三个重载方法、解决重复key问题
  6. 【蓝桥杯国赛真题08】python约分 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析
  7. 交通-城市规划专业常用——10分钟步行圈(百度API)
  8. 网站排名优化快排SEO网站源码
  9. meiyouyingjian------cnclsnvcnsdnvk
  10. 【递推】HDU -2018 母牛的故事斐波那契兔子数列