请教一些 CoffeeScript 的问题

2014-08-01 10:38:01 +08:00
 taoche
CoffeeScript这个语法糖,使用起来感觉挺不错,特别是写面向对象,class有了类的感觉。但是用于生产环境的时候发现有一些问题,请教一下大家。

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

2:CoffeeScript 会自动在函数体内 return最后一句。。为了不让它return,只能自己写一句return true 感觉很傻很浪费。
4892 次点击
所在节点    程序员
31 条回复
66450146
2014-08-01 13:36:27 +08:00
alsotang
2014-08-01 14:32:47 +08:00
1. 不能
2. 不是 return true 是 return
yangzh
2014-08-01 14:38:51 +08:00
我有个疑问,第一个问题,定义函数的方式 coffee 这样做不是很自然很合理吗。。我从来都没有意识到这是一个问题咧
taoche
2014-08-01 14:46:20 +08:00
@zythum 感谢
taoche
2014-08-01 14:46:30 +08:00
@alsotang 抱歉 手误!
taoche
2014-08-01 14:47:18 +08:00
@yangzh 这种写法有执行上下文。调用必须在定义的下面。
没说不合理 只是不灵活
zythum
2014-08-01 19:04:23 +08:00
@66450146 谢谢 原来要先 / 的
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'
taoche
2014-08-01 23:30:13 +08:00
@ant_sz 这个不能算是作用域bug吧。 因为js没有块级作用域。 if else内也就没有作用域。根据 Js的预解析机制,后面的函数声明会覆盖前面的。
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);
```

所以在同一个作用域下面声明的函数之间是可以相互调用的。这个已经是比较符合预期的效果了。我实在看不出还有使用声明式的必要。
taoche
2014-08-02 13:02:28 +08:00
@ant_sz 明白了 感谢回答!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/125564

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX