V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qq12345454
V2EX  ›  问与答

关于 Airbnb JavaScript 编码规范中有个地方不解

  •  
  •   qq12345454 · 2017-08-27 19:53:17 +08:00 · 1676 次点击
    这是一个创建于 2650 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/libertyAlone/airbnb-javascript-style-guide-cn#functions--declarations

    // bad
    function foo() {
      // ...
    }
    
    // bad
    const foo = function () {
      // ...
    };
    
    // good
    const foo = function bar() {
      // ...
    };
    
    
    //不理解为什么最后一个是 good,我感觉第二个应该是 good 啊
    
    14 条回复    2017-08-28 20:12:20 +08:00
    zzuieliyaoli
        1
    zzuieliyaoli  
       2017-08-27 20:34:33 +08:00   ❤️ 1
    这条规则不是有解释吗?

    > 别忘记命名表达式-匿名函数很难在 Error 调用栈中定位问题.
    qq12345454
        2
    qq12345454  
    OP
       2017-08-27 20:40:03 +08:00
    @zzuieliyaoli 谢谢, 抱歉,请恕我愚钝, 还是不理解第三个和第二个有什么区别
    zhlssg
        3
    zhlssg  
       2017-08-27 21:34:25 +08:00 via iPhone   ❤️ 1
    @qq12345454 匿名和具名的区别
    TabGre
        4
    TabGre  
       2017-08-27 22:22:31 +08:00 via iPhone   ❤️ 1
    更好的跟踪错误调用栈,不然全是匿名函数
    qq12345454
        5
    qq12345454  
    OP
       2017-08-27 22:48:28 +08:00
    @zzuieliyaoli
    @zhlssg
    @TabGre

    明白了, 谢谢三位
    kenshinhu
        6
    kenshinhu  
       2017-08-27 23:26:08 +08:00
    @TabGre 有点不解?为什么匿名函数会更好的跟踪错误调用栈??
    FrankFang128
        7
    FrankFang128  
       2017-08-27 23:54:54 +08:00
    第一个为什么是 bad ?
    第二个是 bad 我理解,第三个是 good 我也理解。
    FrankFang128
        8
    FrankFang128  
       2017-08-27 23:55:09 +08:00
    就因为没用 const ?
    ck65
        9
    ck65  
       2017-08-28 02:18:17 +08:00
    @FrankFang128 点进链接看了一下,说是防止声明提升,增强可读性和可维护性。
    geelaw
        10
    geelaw  
       2017-08-28 03:29:38 +08:00
    那还可以更极致一些……

    const foo = (function () {
    return function foo() {
    /* ... */
    }; })();
    weakish
        11
    weakish  
       2017-08-28 09:21:04 +08:00
    @FrankFang128 有些语言定义必须在引用之前。估计从这些语言过来的人习惯了才定这条规则。

    实际上,先定义后引用和先引用后定义的可读性很难说,
    就像数学书先证一堆引理,然后再证定理,
    和先直接证定理,直接在证明中用引理,证明结束了再一个个证用到的引理。
    这两种写法很难说哪个好。

    前者符合「基础的在前,高层的在后,依赖关系明晰」的思路,
    后者符合「从问题出发,将大问题转化成几个小问题,然后再解决小问题」的思路。
    这两个思路都比较符合直觉。

    个人更偏爱后者,从问题出发,思路比较顺畅。
    看到好几个人提到数学里动机比证明重要。

    先引用,后定义,能更容易看到为什么需要定义这个函数,
    我觉得很多时候这个为什么比这个函数是怎样定义的更重要。

    另外,IDE 跳转和浏览做的好的话,定义的先后根本就无关紧要。

    IntelliJ 系的 IDE, 我常常先直接用,然后 Alt+Enter 逐个补定义。
    IDE 总是给我补在上面(类什么的通常会开新文件),
    不过上面下面我不在意,在哪个文件我也不在意。
    因为读代码我不会从上往下读,是利用结构视图和搜索类名、函数名定位到关心的地方。
    引用的东西,大部分时候只要看下名字(喜欢起较长的、描述性的名字)和类型(如果是静态类型语言),
    有时可能要 ctrl+q 查下 api doc, 还搞不定那才 ctrl+b 跳转。
    ctrl + b 会带我到定义那里的,所以到底在上面还是下面,还是另一个文件我并不需要关心。

    回到主题,WebStorm 的 JavaScript 跳转到定义并没有遇到什么问题,
    以前用 sublime 及 vscode 跳转到定义也没什么问题,
    所以这条规则我觉得意义不大。
    autoxbc
        12
    autoxbc  
       2017-08-28 10:45:49 +08:00
    @FrankFang128 #7

    请运行这段代码,感受一下函数声明违反直觉的地方

    if(0)
    {
    function func()
    {
    return 2;
    }
    }
    console.log( func.toString() );
    FrankFang128
        13
    FrankFang128  
       2017-08-28 14:34:13 +08:00
    @autoxbc 不允许在 if 里声明就好
    autoxbc
        14
    autoxbc  
       2017-08-28 20:12:20 +08:00
    @FrankFang128 #13

    显然不仅仅是 if

    函数声明既会提升又不遵守控制流
    就是代码中的野蛮人+特权阶级

    console.log( func() );

    function func()
    {
    return 1;
    }

    for(var i=0;i>1;i++)
    {
    function func()
    {
    return 2;
    }
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1174 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:42 · PVG 02:42 · LAX 10:42 · JFK 13:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.