ES6-箭头函式

本文介绍了ES6中的箭头函数,强调其简洁语法和绑定this值的优势。箭头函数可用于提升代码可读性,减少字符输入,并在某些情况下自动绑定this。然而,它们不适合用于定义对象方法、原型链方法、DOM事件处理或构造函数,因为this值的处理方式不同。此外,箭头函数不具备call、apply、bind方法,不能作为生成器,并且没有arguments对象。
摘要由CSDN通过智能技术生成

4b2a2c5d6e241e31f73306eed24920ba.png

来源 | 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 = this


  setTimeout(
    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时,有可能不是如预期般的结果。

学习更多技能

请点击下方公众号

53fdb363a31ffc36a99cc1b2fd981795.gif

2cb8b9299aa70759e8b33962f47dbda3.png

cc3c22658e20022ffd1ca916e177a5af.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值