写coffee的同学你们知道这两个的区别么?

2014-01-17 18:28:52 +08:00
 zythum
我想要的意图是这样
http://gist.github.com/zythum/8471205

话说coffee是这样
http://gist.github.com/zythum/8470938

话说上下两种的区别是什么呢?

话说今天手贱想看看coffee能把js精简到怎么样子。
话说这个大家项目过程中都遇到过么

话说我想要声明他是局部变量该怎么办呢?
人为约定局部变量用 _ 开头?, 还是声明他作为函数的参数?

注: 刚用coffee 2小时发现的问题。求用了2个月的同学指导。
7563 次点击
所在节点    Node.js
42 条回复
panlilu
2014-01-17 18:48:10 +08:00
coffee 会自动在变量第一次出现时加上var,详细的可以在try coffee script里面敲两段代码观察生成的代码的不同之处。
不用特地的声明是局部变量,只要这个变量名没在外面一层出现过就默认是局部的。
zythum
2014-01-17 18:52:01 +08:00
@panlilu 但是问题就是我不知道是不是外面出现过, 比如一个代码1000多行的。但是出现过了就不var...

别说一个代码不用改1000多行.. 举个例子.
zythum
2014-01-17 18:54:21 +08:00
@panlilu 刚才体验了下。 ()-> 确实方便,少打字符。 语法糖确实用着不错。

但是 朱一默认是想这js该怎么写。然后翻译成coffee是怎么样子的。就和当初学英语一样。
zythum
2014-01-17 18:55:15 +08:00
@Livid 自动标签取很准。这次的关键词确实是局部变量
Mutoo
2014-01-17 19:02:11 +08:00
@zythum 出现过的变量名有代码提示。

或者试用 @ 修饰变量,相当于用 this

p.s. 我不是用coffeescript 2个月,而是2个月前用过 coffeescript
guangwong
2014-01-17 19:05:19 +08:00
卤煮你蛋疼不
anjianshi
2014-01-17 19:12:51 +08:00
一个勉强的解决的办法:
value = 1
fn = ->
`var value` # 通过这句强制创建一个局部变量
value = 2
不过这样非常麻烦

除此之外基本无解了,网上也有不少人提到这个问题,我估计 coffee 以后会改进
目前就少用全局变量,多利用命名空间吧
写了一段时间的 coffee 代码,比较长的也有,还没碰到关于它的问题
anjianshi
2014-01-17 19:14:45 +08:00
HaEx
2014-01-17 19:18:53 +08:00
qiukun
2014-01-17 19:24:02 +08:00
((local var) ->gao)() 虽然官方说不能 shadow ,其实是可以的,大意就是通过闭包。
zythum
2014-01-17 22:58:10 +08:00
@Mutoo 不能用this, 不管是面向类,还是函数都不对。
就比如
function a(){this.a=5}; a(); window.a === 5;

@anjianshi 这还不如用 _ 约素 或者 用参数做var 来得靠谱,比如 function(a,b, /*我是局部变量*/c) { c = 5}

@qiukun 这个和用参数来代替var 是一个道理把

@Mutoo 这个是很重要的问题。 因为如果想大规模使用的话是不能避免的。这种运行时的又是很隐性的问题是最要命的。万一出个这个方面的bug。都不知道怎么死的。bug一查就是半天过去了。
Mutoo
2014-01-17 23:40:12 +08:00
@zythum 看过几个coffeescript的项目,基本都靠测试框架来保证正确性。
qiukun
2014-01-18 00:08:34 +08:00
@zythum 是一个道理,SO 有这个问题的
yyfearth
2014-01-18 00:29:37 +08:00
@zythum 隐形声明变量的语言也有不少 coffee 只是其中之一,如果你模块化或者OOP做的足够好,加上使用 Promise,那么 function 就不会也不应该嵌套太深。只要函数不嵌套太深,那么变量的 scope 控制也相对容易。
另外对于 this 的控制 coffee 提供 -> => 就很不错。
我用 coffee 主要是 OOP 比较方便,另外就是语法和糖比较适合我(喜欢 Ruby 语法)
如果你仅仅是想用 coffee 里面的语法糖方便编码,那么还不如用新版本的 JS
貌似 最新的 ECMAScript 就是 Harmony 解决了很多 JS 的坑(比如用 let 代替 var),而且把 coffee 很多特点吸纳过去了,比如 =>
另外 class 什么的也都有了,还有强大的 generator 和 yield。
zythum
2014-01-18 01:14:10 +08:00
@yyfearth 好久不见。
今天有仔细看了coffee。因为正好看到 松本行弘的书,松本便是coffee很有前途。
这次只是对coffee的只是普及. Harmony 增加了不少语法糖,甚至把promise都加进去了。话=>的处理为什么是用_this = this来作为一个外部变量处理。不用func.bind(this)来转换this呢?

话说这个不是嵌套太深的问题。只要是用函数。有类就会有这个问题, 特别是多人开发的时候。只是怎么去规避。举个例子
http://gist.github.com/zythum/8477316

这个例子是不是很简单又有普遍性。
zythum
2014-01-18 01:31:52 +08:00
发现一个呵呵的地方需要注意。
因为函数默认return 最后一个表达式的值。所以如果需要一些函数返回值有特殊意义的。比如浏览器事件的回调函数。renturn fasle会阻止浏览器默认行为,那也会呵呵的。

http://gist.github.com/zythum/8477617
yyfearth
2014-01-18 01:45:07 +08:00
@zythum return 也是我一个很头疼的地方 所以我基本上都 手动加 return 在最后面
yyfearth
2014-01-18 02:06:59 +08:00
@zythum function 后面如果不return任何东西我就手动加return,如果是method,最后都加个this
yyfearth
2014-01-18 02:09:37 +08:00
@zythum 应该是兼容性考虑,他们之前有那个branch,但是一直没动
breeswish
2014-01-18 09:06:10 +08:00
@zythum ^^ 朱一也来Coffee的坑了哈~
一开始也是觉得,写Coffee要想着怎么写,写起来特别慢,还要经常翻手册
不过熟悉以后就写起来快多了,会写的很顺手的

另外提醒一个坑,在coffee里的“全局”变量不在全局里(特指web下),因为最后外面会被闭包一下,所以必须要用window.来声明一个全局变量~

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

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

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

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

© 2021 V2EX