1
yangff 2014-08-01 10:43:03 +08:00 via Android
你可以写一个0的。。
|
3
datou552211 2014-08-01 11:16:33 +08:00 via iPhone
return挺好的啊,不仅返回值的时候需要它。还可以观察函数执行情况
|
4
taoche OP @datou552211 自己忘记写return了 就容易出错
|
6
orancho 2014-08-01 12:05:51 +08:00
“自动在函数体内return最后一句”是从Ruby继承的
|
8
taoche OP @7anshuai 感谢,'' 确实是一个解决办法。
用函数表达式,比较严谨。但是声明比较灵活。 经过这段时间的书写,感觉函数表达式可读性更强一些。 和python 依赖模块 需要先import requirejs的amd模块也推荐的是先定义。 |
9
lsj5031 2014-08-01 12:27:48 +08:00
第一個問題沒怎麼看懂,我猜 do 是不是滿足要求?
第二個問題如果不想返回值留個空 return 就好了呀,自動 return 出錯的場景暫時沒見過。 linux 下用的 rime, 繁體見諒。 |
10
taoche OP @lsj5031 感谢回复。 我试了一下do 并不是函数声明的方式。
第二个问题,空return是可以在编译的时候被过滤。 |
11
zythum 2014-08-01 12:32:20 +08:00
|
12
orancho 2014-08-01 12:34:22 +08:00
@orancho coffee本来就是Ruby社区的产物,初版解释器都是Ruby写的。某个Ruby程序员写js写烦了然后就写出了Ruby。 历史原因。
|
13
zythum 2014-08-01 12:34:44 +08:00
朱一看来coffee 最大的问题是 t/97426, 对于不会js,不知道coffee编译规则的很容易出现这种看上去顾名思义的问题。其他感觉都不是问题。
|
14
zythum 2014-08-01 12:35:31 +08:00
抱歉 忘记加空格了 t/97426
|
15
zythum 2014-08-01 12:36:03 +08:00
http://www.v2ex.com/t/125564 ...难道我忘记站内url跳转规则了?
|
16
mcfog 2014-08-01 12:41:18 +08:00
个人认为coffee最大的问题是局部变量和外层的变量不能同名
不过包括楼主说那几个问题,在coffee的两个比较大的分支里都有解决方案 https://github.com/satyr/coco https://github.com/gkz/LiveScript/ |
18
imcotton 2014-08-01 12:55:27 +08:00
声明绝对局部变量可以采用 IIFE 的方式
a = 1 b = 2 do ({a, b} = {}) -> a = 3 b = 4 |
19
imcotton 2014-08-01 12:56:04 +08:00
a = 1
b = 2 do ({a, b} = {}) -> a = 3 b = 4 |
20
imcotton 2014-08-01 13:00:07 +08:00
自己脑补上面最后两行的缩进吧
|
22
alsotang 2014-08-01 14:32:47 +08:00
1. 不能
2. 不是 return true 是 return |
23
yangzh 2014-08-01 14:38:51 +08:00
我有个疑问,第一个问题,定义函数的方式 coffee 这样做不是很自然很合理吗。。我从来都没有意识到这是一个问题咧
|
28
ant_sz 2014-08-01 23:16:33 +08:00
coffeescript 强制你使用函数表达式的写法是为了避免 Javascript 函数声明的作用域bug。你应该接受这种写法,而且在以后写 Javascript 的时候也尽量采用这种写法。
所谓作用域的bug,简单就是 if (true) { function doSomething() { alert('A'); } } else { function doSomething() { alert('B'); } } doSomething() 上述程序看似应该 alert 'A' 实际上将总是 alert 'B' |
29
taoche OP @ant_sz 这个不能算是作用域bug吧。 因为js没有块级作用域。 if else内也就没有作用域。根据 Js的预解析机制,后面的函数声明会覆盖前面的。
|
30
ant_sz 2014-08-02 10:34:07 +08:00
@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); ``` 所以在同一个作用域下面声明的函数之间是可以相互调用的。这个已经是比较符合预期的效果了。我实在看不出还有使用声明式的必要。 |