V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
tedd
V2EX  ›  JavaScript

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

  •  
  •   tedd · 2017-03-08 14:25:39 +08:00 · 3424 次点击
    这是一个创建于 2852 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 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-03-08 14:29:17 +08:00   ❤️ 1
    有的啊, () => {} 是新功能,不是替代旧功能。

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

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

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

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

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

    当然特定时候也有必须要用 this 就不能用箭头函数了。
    ksmagi
        7
    ksmagi  
       2017-03-08 20:25:50 +08:00
    arrow function == (function () {}).bind(this)
    fytriht
        8
    fytriht  
       2017-03-08 21:26:07 +08:00 via Android
    function () {} 已经很简单了吧
    chnwillliu
        9
    chnwillliu  
       2017-03-08 21:32:45 +08:00
    在对象字面量和 class 中声明函数属性,可以直接括号,不需要 function 关键字。所以大部分场合 function 关键字是可以被干掉了。
    tedd
        10
    tedd  
    OP
       2017-03-08 21:47:03 +08:00
    @chnwillliu 请问你指的是这样写吗?也不需要 let 和 const ?`something = () => { }`
    kamikat
        11
    kamikat  
       2017-03-09 01:05:08 +08:00
    bombless
        12
    bombless  
       2017-03-09 01:33:10 +08:00 via Android
    es6 加了个在字面量定义函数的功能也挺方便

    +{ a() {} }.a()
    bombless
        13
    bombless  
       2017-03-09 01:33:44 +08:00 via Android
    噗,才看到上面已经说了
    SoloCompany
        14
    SoloCompany  
       2017-03-09 01:37:15 +08:00
    严格来说叫 lambda
    实现上来说箭头函数是匿名函数
    都叫做匿名函数了,何来声明?
    bombless
        15
    bombless  
       2017-03-09 01:46:10 +08:00 via Android
    其实现在很多人的习惯是写 const f = () => 0 这样的,我也不知道为什么,可能是不喜欢声明提前吧
    felix389
        16
    felix389  
       2017-03-16 13:50:13 +08:00
    现在的()=> {}比以前方便了啊,要是还是 function declaration 就继续用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2570 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:49 · PVG 18:49 · LAX 02:49 · JFK 05:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.