有一个函数很短,比如这样:

1
2
3
4
5
6
function getData() {
return { data: 1 }
}

console.log(getData())
// { data: 1 }

想用ES6箭头函数语法简化一下,于是写成这样:

1
2
3
4
const getData = () => { data: 1 }

console.log(getData())
// undefined

怎么会是呢?

解析

根本原因在于这一段:

1
const getData = () => { data: 1 }

如果用传统function来写,和下面是等价的:

1
2
3
function getData() {
data: 1
}

那么还有一个问题,第二行这个玩意居然是合法语句?

是的,它定义了一个标签,一般套在循环结构外面,比如下面的:

1
2
3
4
5
6
7
8
9
10
11
12
13
let i, j

outer:
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if (j == 2) {
break outer
}
}
}

console.log(i, j)
// 0 2

果然和Java一个模子里刻出来的,这个语法一模一样。

解决方法

到这里就很简单了,把第一行改一下即可。

1
const getData = () => ({ data: 1 })

不过这么多括号着实有点丑。