简介

JavaScript 中,函数可以用箭头语法(”=>”)定义,有时候也叫“lambda表达式”。这种语法主要意图是定义轻量级的内联回调函数。例如:

// Arrow function:
[5, 8, 9].map(item => item + 1); // -> [6, 9, 10] // Classic function equivalent:
[5, 8, 9].map(function(item) {
return item + 1;
}); // -> [6, 9, 10]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

当箭头函数有一个参数时,参数两边的括号是可有可无的,但是还是有括号看起来看清楚。

const foo = bar => bar + 1;
const bar = (baz) => baz + 1;
  • 1
  • 2

箭头函数不带参数时,必须要用括号,比如:

const foo = () => "foo";
  • 1

如果函数体不是只一行,应该用花括号,并显式地返回(如果需要返回值)。

const foo = bar => {
const baz = 5;
return bar + baz;
};
foo(1); // -> 6
  • 1
  • 2
  • 3
  • 4
  • 5

arguments object

箭头函数不会暴露 argument 对象,所以,argument 将简单地指向当前scope内的一个变量。

arguments object 是所有函数中的一个本地变量。你可以通过 arguments 对象引用函数的入参。这个对象包含传给这个函数的每个入参的入口,索引从0开始,例如: 
arguments[0] 
arguments[1] 
arguments[2]

const arguments = [true];
const foo = x => console.log(arguments[0]); foo(false); // -> true
  • 1
  • 2
  • 3
  • 4

基于此,箭头函数也不知道它的调用者。 
当缺少arguments object时,可能会有所限制(极少数情况),其余的参数一般可以做为替代。

const arguments = [true];
const foo = (...arguments) => console.log(arguments[0]); foo(false); // -> false
  • 1
  • 2
  • 3
  • 4

绑定this的值

箭头函数是 lexically scoped,这意味着其 this 绑定到了附近scope的上下文。也就是说,不管this指向什么,都可以用一个箭头函数保存。

看下面的例子, Cow 类有一个方法在1秒后输出sound。

class Cow {
constructor() {
this.sound = "moo";
}
makeSoundLater() {
setTimeout(() => {
console.log(this.sound);
}, 1000);
}
} var myCow = new Cow();
var yourCow = new Cow(); yourCow.sound = "moooooo"; myCow.makeSoundLater();
yourCow.makeSoundLater();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在 makeSoundLater() 方法中,this 指向当前 Cow 对象的实例。所以在这个例子中当我们调用 myCow.makeSoundLater(), this 指向 myCow。然后,通过使用箭头函数,我们保存了 this,这样我们就可以在需要时引用 this.sound 了。将会输出 “moo”,而不是yourCow.makeSoundLater()输出的“moooooo”。

隐式返回值

箭头函数可以通过省略掉小括号做到隐式返回值。

const foo = x => x + 1;
foo(1); // -> 2
  • 1
  • 2

当使用隐式返回时,Object Literal 必须用花括号括起来。

Object Literal 是用花括号括起来的,分号隔开的 k-v 对象列表。

const foo = () => { bar: 1 } // foo() returns undefined
const foo = () => ({ bar: 1 }) // foo() returns {bar: 1}
  • 1
  • 2

显示返回值

const foo = x => {
return x + 1;
} foo(1); // -> 2
  • 1
  • 2
  • 3
  • 4
  • 5

语法


x => y // Implicit return x => { return y } // Explicit return (x, y, z) => { ... } // Multiple arguments (() => { ... })() // Immediately-invoked function expression

arrow function的更多相关文章

  1. 廖雪峰js教程笔记5 Arrow Function(箭头函数)

    为什么叫Arrow Function?因为它的定义用的就是一个箭头: x => x * x 上面的箭头函数相当于: function (x) { return x * x; } 箭头函数 阅读: ...

  2. JavaScript学习笔记(十二)——箭头函数(Arrow Function)

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  3. ES6 new syntax of Arrow Function

    Arrow Function.md Arrow Functions The basic syntax of an arrow function is as follows var fn = data ...

  4. arrow function and bind

    Can you bind arrow functions? https://stackoverflow.com/questions/33308121/can-you-bind-arrow-functi ...

  5. JS面试Q&A(续2): Rest parameter,Arrow function 等

    rest parameter 和 Destructuring assignment. function fun1(...theArgs) { console.log(theArgs.length);} ...

  6. arrow function、function.apply

    An arrow function expression has a shorter syntax than a function expression and does not have its o ...

  7. Arrow function restore

    Arrow function restore 为什么叫Arrow Function?因为它的定义用的就是一个箭头: x => x * x 上面的箭头函数相当于: function (x) { r ...

  8. [ES6] 06. Arrow Function =>

    ES6 arrow function is somehow like CoffeeScirpt. CoffeeScript: //function call coffee = -> coffee ...

  9. 10th week task -3 Arrow function restore

    Arrow function restore 为什么叫Arrow Function?因为它的定义用的就是一个箭头: x => x * x 上面的箭头函数相当于: function (x) { r ...

随机推荐

  1. AndroidStudio生成APK注意的几个问题

    生成APK遇到两个问题:一是生成的APK安装失败(没有勾选V1所致),二是生成APK后,百度与谷歌地图不显示(SHA1值改变所致). 通过Build>Generate Signed APK生成A ...

  2. 2018年-2019年第二学期第七周C#学习个人总结

    在本周我又学习了,第五章面向对象高级中的5.5异常和5.6命名空间和程序集.在5.5异常中我知道了异常层次结构:所有的异常类都继承自Exception类.由于发生了异常程序立即终止无法再继续向下执行. ...

  3. Java实训作业1

    1.编写程序:声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果 2.编写程序:从键盘输入圆的半径,计算圆的面积并输出. 3.编写程序:实现一个数字加密器.运行时输入加密 ...

  4. 7-27 Codeforces Round #499 (Div. 2)

    C. Fly 链接:http://codeforces.com/group/1EzrFFyOc0/contest/1011/problem/C 题型:binary search .math. 题意:总 ...

  5. Bootstrap3基础 下载bootstrap3压缩包和相应的jQuery文件

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  6. Java多线程的创建与简单使用

    一.线程的基本概念 什么是线程:Thread 进程内部的一个执行单元,它是程序中一个单一的顺序控制流程. 线程又被称为轻量级进程(lightweight process) 如果在一个进程中同时运行了多 ...

  7. Redis Index

    Indexes 集群 主从模型 哨兵机制与RAFT算法 实践 单机多实例 开启Sentinel 存储 持久化 RDB 与 AOF 数据结构 内存管理 事务 并发问题 分布式锁 整体图 中间件 Jedi ...

  8. SpringAOP的xml实例、注解形式实例、概念理解 以及execution表达式实例与概念说明

    (1)Spring AOP的简单应用: -->AOP:(Aspect Orinted Programming)面向切面编程,用于具有横切逻辑的场合,如:访问控制,事务管理,性能检测,由切入点和增 ...

  9. 承接AR摄像头识别外包 AR图像识别 AR识别图像 AR识别应用外包

    增强现实简称AR,是一种实时计算摄影机影像的位置及角度并加上相应图像的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并实现互动. 这里千万别和VR虚拟现实混了.简单说就是VR看到的场景都是假的, ...

  10. Autofac IOC框架

    ASP.NET Core自带了一个轻量级的IOC容器     但是只提供了最基本的AddXXX方法来绑定实例关系     需要一个一个添加   可以使用其他IOC容器来替换内置的 ABP自带Castl ...