请教一些 CoffeeScript 的问题 - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
taoche

请教一些 CoffeeScript 的问题

  •  
  •   taoche Aug 1, 2014 5700 views
    This topic created in 4322 days ago, the information mentioned may be changed or developed.
    CoffeeScript这个语法糖,使用起来感觉挺不错,特别是写面向对象,class有了类的感觉。但是用于生产环境的时候发现有一些问题,请教一下大家。

    1: CoffeeScript可以写 函数声明吗? 根据CoffeeScript的文档,CoffeeScript只有函数表达式的写法。这种写法有执行上下文。调用必须在定义的下面,感觉不是很方便。

    2:CoffeeScript 会自动在函数体内 return最后一句。。为了不让它return,只能自己写一句return true 感觉很傻很浪费。
    31 replies    2014-08-02 13:02:28 +08:00
    yangff
        1
    yangff  
       Aug 1, 2014 via Android
    你可以写一个0的。。
    taoche
        2
    taoche  
    OP
       Aug 1, 2014   1
    @yangff 这。。。
    datou552211
        3
    datou552211  
       Aug 1, 2014 via iPhone
    return挺好的啊,不仅返回值的时候需要它。还可以观察函数执行情况
    /table>
    taoche
        4
    taoche  
    OP
       Aug 1, 2014   1
    @datou552211 自己忘记写return了 就容易出错
    7anshuai
        5
    7anshuai  
       Aug 1, 2014
    @taoche
    可以直接内嵌JS的函数声明代码
    abc()
    `function abc(){}`
    但是推荐用函数表达式
    orancho
        6
    orancho  
       Aug 1, 2014
    “自动在函数体内return最后一句”是从Ruby继承的
    taoche
        7
    taoche  
    OP
       Aug 1, 2014   1
    @orancho 这个不是说不好,而是和js的思想有点不一样。
    taoche
        8
    taoche  
    OP
       Aug 1, 2014   1
    @7anshuai 感谢,'' 确实是一个解决办法。
    用函数表达式,比较严谨。但是声明比较灵活。 经过这段时间的书写,感觉函数表达式可读性更强一些。
    和python 依赖模块 需要先import requirejs的amd模块也推荐的是先定义。
    lsj5031
        9
    lsj5031  
       Aug 1, 2014
    第一怎看懂,我猜 do 是不是足要求?
    第二如果不想返回值留空 return 就好了呀,自 return 出的景。
    linux 下用的 rime, 繁。
    taoche
        10
    taoche  
    OP
       Aug 1, 2014   1
    @lsj5031 感谢回复。 我试了一下do 并不是函数声明的方式。
    第二个问题,空return是可以在编译的时候被过滤。
    zythum
        11
    zythum  
       Aug 1, 2014
    @lsj5031
    lz的意思是
    coffee 只能是 var noop = function () {}
    lz需要 function noop () {}
    orancho
        12
    orancho  
       Aug 1, 2014
    @orancho coffee本来就是Ruby社区的产物,初版解释器都是Ruby写的。某个Ruby程序员写js写烦了然后就写出了Ruby。 历史原因。
    zythum
        13
    zythum  
       Aug 1, 2014
    朱一看来coffee 最大的问题是 t/97426, 对于不会js,不知道coffee编译规则的很容易出现这种看上去顾名思义的问题。其他感觉都不是问题。
    zythum
        14
    zythum  
       Aug 1, 2014
    抱歉 忘记加空格了 t/97426
    zythum
        15
    zythum  
       Aug 1, 2014
    http://www.v2ex.com/t/125564 ...难道我忘记站内url跳转规则了?
    mcfog
        16
    mcfog  
       Aug 1, 2014
    个人认为coffee最大的问题是局部变量和外层的变量不能同名

    不过包括楼主说那几个问题,在coffee的两个比较大的分支里都有解决方案

    https://github.com/satyr/coco
    https://github.com/gkz/LiveScript/
    lsj5031
        17
    lsj5031  
       Aug 1, 2014
    @zythum
    啊,。明白了……
    imcotton
        18
    imcotton  
       Aug 1, 2014
    声明绝对局部变量可以采用 IIFE 的方式

    a = 1
    b = 2

    do ({a, b} = {}) ->
    a = 3
    b = 4
    imcotton
        19
    imcotton  
       Aug 1, 2014
    a = 1
    b = 2

    do ({a, b} = {}) ->
    a = 3
    b = 4
    imcotton
        20
    imcotton  
       Aug 1, 2014
    自己脑补上面最后两行的缩进吧
    66450146
        21
    66450146  
       Aug 1, 2014
    alsotang
        22
    alsotang  
       Aug 1, 2014
    1. 不能
    2. 不是 return true 是 return
    yangzh
        23
    yangzh  
       Aug 1, 2014
    我有个疑问,第一个问题,定义函数的方式 coffee 这样做不是很自然很合理吗。。我从来都没有意识到这是一个问题咧
    taoche
        24
    taoche  
    OP
       Aug 1, 2014   1
    @zythum 感谢
    taoche
        25
    taoche  
    OP
       Aug 1, 2014   1
    @alsotang 抱歉 手误!
    taoche
        26
    taoche  
    OP
       Aug 1, 2014   1
    @yangzh 这种写法有执行上下文。调用必须在定义的下面。
    没说不合理 只是不灵活
    zythum
        27
    zythum  
       Aug 1, 2014
    @66450146 谢谢 原来要先 / 的
    ant_sz
        28
    ant_sz  
       Aug 1, 2014
    coffeescript 强制你使用函数表达式的写法是为了避免 Javascript 函数声明的作用域bug。你应该接受这种写法,而且在以后写 Javascript 的时候也尽量采用这种写法。

    所谓作用域的bug,简单就是

    if (true) {
    function doSomething() { alert('A'); }
    } else {
    function doSomething() { alert('B'); }
    }

    doSomething()

    上述程序看似应该 alert 'A' 实际上将总是 alert 'B'
    taoche
        29
    taoche  
    OP
       Aug 1, 2014
    @ant_sz 这个不能算是作用域bug吧。 因为js没有块级作用域。 if else内也就没有作用域。根据 Js的预解析机制,后面的函数声明会覆盖前面的。
    ant_sz
        30
    ant_sz  
       Aug 2, 2014
    @taoche 是不是bug有点争议,虽然现代浏览器对这个有一定的优化,但是使用赋值式的函数声明还是有最好的兼容性。因此尽可能采用这种方式比较好。

    另外,貌似在这种coffeescript为了解决调用需要在声明之后的问题,在编译的时候会首先将所有作用域内的变量都声明下,譬如

    ```
    a = () -> console.log 'a'
    b = () -> console.log 'b'
    ```

    会被编译成

    ```
    (function() {
    var a, b; // 这里预声明了所有变量k

    a = function() {
    return console.log('a');
    };

    b = function() {
    return console.log('b');
    };

    }).call(this);
    ```

    所以在同一个作用域下面声明的函数之间是可以相互调用的。这个已经是比较符合预期的效果了。我实在看不出还有使用声明式的必要。
    taoche
        31
    taoche  
    OP
       Aug 2, 2014
    @ant_sz 明白了 感谢回答!
    About     Help     Advertise     Blog     API     FAQ     Solana     3181 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 71ms UTC 12:16 PVG 20:16 LAX 05:16 JFK 08:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86