JavaScript中的箭头函数详解

什么是箭头函数?

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。箭头函数相当于匿名函数,并且简化了函数定义。
箭头函数的语法

(parameters) => { statements }

举一个常规的例子

// 使用常规语法定义函数
function funcName(params) {
   return params * 3;
 }
funcName(1);
// 3

// 使用箭头函数定义函数
var funcName = (params) => params * 3
funcName(1);
// 3

可以清晰得看到,只须一行代码就可以搞定一个函数,简化了函数定义,书写匿名函数的时候更加方便,在代码书写过程中多处可以使用到箭头函数。

语法解析

// 通用语法
(parameters) => { statements }
// 只有一个参数时,可以省略小括号
parameters => { statements }
// 没有参数时,简化为
() => {statements }
// 返回值只有一个表达式时,可以省略大括号
parameters => expression

//特殊例子,返回带有大括号的单表达式
x => { foo: x }  // error
x => ({ foo: x }) // 加上小括号,ok

没有局部this的绑定

和一般的函数不同,箭头函数不会绑定this。 或则说箭头函数不会改变this本来的绑定。
下面举个例子

function Counter() {
  this.num = 0;
  this.timer = setInterval(function add() {
    this.num++;
    console.log(this.num);
  }, 1000);
}

var b = new Counter();
// NaN
// NaN
// NaN
// ...

上述代码是使用常规函数定义,setInterval是一个普通函数,而且没有bind、call、apply等,所以内部的this指向的是全局this,全局this没有num这个属性,从而这边输出的都是NaN。要解决这个问题有多种方法,可以先将Counter函数的this用一个参数保存起来,在setInterval函数内部调用这个参数;也可以为setInterval绑定一个this,通过bind实现。在这边,我们考虑使用箭头函数来解决这个问题,看看下面的代码:

function Counter() {
  this.num = 0;
  this.timer = setInterval(() => {
    this.num++;
    console.log(this.num);
  }, 1000);
}

var b = new Counter();
// 1
// 2
// 3
// ...

因为箭头函数不会改变this本来的绑定,所以在上述代码中通过Counter构造函数绑定的this将会被保留。在setInterval函数中,this依然指向我们新创建的b对象。

通过上述的描述,我们可以知道箭头函数没有局部this的绑定,所以我们使用箭头函数来实现React的事件处理。参考:《React事件处理》

总结

箭头函数有两个突出的优点:

  • 语法简单,简化函数定义
  • 不会改变this的绑定
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,702评论 0 5
  • 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 上面代码检查函数l...
    呼呼哥阅读 3,577评论 0 1
  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,553评论 1 33
  • JavaScript 初学者必看“箭头函数” 译者按: 箭头函数看上去只是语法的变动,其实也影响了this的作用域...
    Fundebug阅读 417评论 0 17
  • 通过这样的方式,我们在思考时,就可以在大量复杂的信息中,用最短的时间明确方向、锁定关键信息。在沟通问题时,可以让听...
    机智果阅读 1,201评论 0 0