tedd
V2EX  ›  JavaScript

ES6 中没有函数申明的语法了吗?

By tedd at 2017 年 3 月 8 日 · 4469 次点击

在 ES5 中,我经常用函数申明 function declaration 来申明函数

function myFunc() {}

这样的好处是我可以把函数的实现写在最下方,这样让程序更易读,看了前面就知道大概逻辑了,如果需要再往下看具体的小函数的实现

doSomething();
doSomethingElse();

function doSomething() {}
function doSomethingElse() {}

如果用 function expression 的话,就需要将 expression 写在调用的前面

var doSomething = function() {}
var doSomethingElse = function() {}

doSomething();
doSomethingElse();

但 ES6 中好像只支持 function declaration 了...

let doSomething = ()=> {}
16 条回复  •  2017-03-16 13:50:13 +08:00
fy
   1
fy  
   2017 年 3 月 8 日   ❤️ 1
有的啊, () => {} 是新功能,不是替代旧功能。

而且 () => {} 函数和 function () {} 的含义也不一样,是两种用途
tedd
   2
tedd  
OP
   2017 年 3 月 8 日
哦哦,表达不是特别清楚, ES6 中可以用之前一样的语法来 function declaration ,我想问的是,在 ES6 中有什么简便的语法来做 function declaration 吗?
xingo
   3
xingo  
   2017 年 3 月 8 日   ❤️ 1
ES2015 兼容 ES5 , function a() {} 还是他原来的意思

var a = function (){} a 声明提前,但赋值是到运行这条语句的时候才会赋值, ES5

let a = () => {} 首先 let 是声明不会提前,其次赋值也是到运行这条语句的时候才会赋值 ,箭头函数 /let 是 ES2015 新增内容

var a = () => {} 那和你说的 var a = function(){} 才类似呢
xingo
   4
xingo  
   2017 年 3 月 8 日
我觉得应该没有?有的话请楼下 at 我,谢谢!
AV1
   5
AV1  
   2017 年 3 月 8 日
ES6 的 arrow function 不是用来“取代” ES5 的普通函数的,其设计初衷是简化 lambda expression 的写法。
所以,不要想当然地恨不得把所有的 function declaration 都换成 arrow function 。该用 function declaration 时还得老老实实地用 function declaration 。
fy
   6
fy  
   2017 年 3 月 8 日
@tedd 没有简便语法,和原来一样。

箭头函数的 this 是外部的 this ,这个在 callback 的场景非常明显!不用保存上级的 this 引用。

当然特定时候也有必须要用 this 就不能用箭头函数了。
yukixz
   7
yukixz  
   2017 年 3 月 8 日
arrow function == (function () {}).bind(this)
fytriht
   8
fytriht  
   2017 年 3 月 8 日 via Android
function () {} 已经很简单了吧
chnwillliu
   9
chnwillliu  
   2017 年 3 月 8 日
在对象字面量和 class 中声明函数属性,可以直接括号,不需要 function 关键字。所以大部分场合 function 关键字是可以被干掉了。
tedd
   10
tedd  
OP
   2017 年 3 月 8 日
@chnwillliu 请问你指的是这样写吗?也不需要 let 和 const ?`something = () => { }`
bombless
   12
bombless  
   2017 年 3 月 9 日 via Android
es6 加了个在字面量定义函数的功能也挺方便

+{ a() {} }.a()
bombless
   13
bombless  
   2017 年 3 月 9 日 via Android
噗,才看到上面已经说了
SoloCompany
   14
SoloCompany  
   2017 年 3 月 9 日
严格来说叫 lambda
实现上来说箭头函数是匿名函数
都叫做匿名函数了,何来声明?
bombless
   15
bombless  
   2017 年 3 月 9 日 via Android
其实现在很多人的习惯是写 const f = () => 0 这样的,我也不知道为什么,可能是不喜欢声明提前吧
felix389
   16
felix389  
   2017 年 3 月 16 日
现在的()=> {}比以前方便了啊,要是还是 function declaration 就继续用
推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
© 2026 V2EX · 76ms · 3.9.8.5