写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个月的同学指导。
7705 次点击
所在节点    Node.js
42 条回复
zythum
2014-01-18 09:13:48 +08:00
@breeswish

(function(){ //所有代码在这里 }).call(this)

这个刚开始就看到了。 谢谢提醒。
其实不用window也是可以的。在最外面@ === window。所以@global也是全局的。
skydiver
2014-01-18 09:32:51 +08:00
为啥我看到的帖子里是两块空白看不到代码?
kingwkb
2014-01-18 09:53:40 +08:00
@Livid 我也是看不到代码
yayy
2014-01-18 12:57:28 +08:00
@skydiver @kingwkb 因为传输 gist 的时候没走https,被 block 了。
reducm
2014-01-18 13:04:41 +08:00
@skydiver
@kingwkb

goagent设了github白名单吧, 关了直接可看。

工作中用了一年多的coffee,倒从没遇到这个问题。的确要注意这种情况,全局函数还是加个window比较好点,感谢楼主提出。
anjianshi
2014-01-18 16:37:15 +08:00
@breeswish 编译的时候加个 --bare 参数就是"真"全局变量了
miniwade514
2014-01-21 09:39:38 +08:00
为何要用 call 和 apply 呢?为什么不直接 b = arguments.slice( 1 ); 和 sun( [ b, b[ 0 ] += a ][ 0 ] ); 呢?
zythum
2014-01-21 10:25:57 +08:00
@miniwade514

1. 'slice' in arguments === false arguments并不是数组,是个类数组,没有slice方法的。所以需要借调用数组slice方法
这里写作:
[].slice.call(arguments, 1)
[].slice.apply(arguments, [1])
Array.prototype.slice.call(arguments, 1)
Array.prototype.slice.apply(arguments, [1])
都是可以的。

2. 关于callee.apply: 习惯了在函数里面调用自身的时候不使用函数名。 因为以后如果要改函数名或者用到其他地方都要做相应的修改。这个仁者见仁智者见智把。
zythum
2014-01-21 10:29:40 +08:00
@miniwade514 还有就是使用arguments.callee.apply(this, [b, b[0] += a][0])可以保证递归的过程中this一致。虽然这个功能并不需要保证这个。
miniwade514
2014-01-21 10:39:56 +08:00
@zythum 一下涨了好多姿势!多谢 :D
zythum
2014-01-21 10:40:00 +08:00
当然我上面只是举个例子。
sum函数科学的写法应该是这样

http://gist.github.com/zythum/8533518

当然需要ECMAScrip 5 标准。

这样是不是发现coffee真的能少敲很多字。可以保护键盘哦。
zythum
2014-01-21 10:46:49 +08:00
@yyfearth 或者为什么折腾完coffee之后朱一开始不自觉得看ruby了怎么破...

不是说要的要折腾oc的啊...话说oc完全看不进去啊怎么破...

要是app可以拿ruby或者js写就好了5555 (不要跟我说node-webkit或者大HTML5做Web app。已经被web app坑惨了)
yyfearth
2014-01-21 11:12:16 +08:00
@zythum 在 strict mode 下面,裸 function 里面 this 不会是 window,另外 coffee 编译时候会自己在最外面加上一个 (function(){ ..... })()
学习ruby没啥不好啊,ruby on rails 挺不错的,可以学习一下,以后说不定还会用到
ObjC 我一直想碰,一直下不了手,原因有二:语法接受不了,那么一大堆的 [] 看到我头疼(习惯了C++/Java),另外就是如果写iOS,不越狱还没发真机用($99一年太贵了,必须找冤大头买单),想到就没兴趣了
你说web app坑,我觉得怎么样都是坑,哪里有不坑的东西,只是看那个坑跳着舒服而已。
yyfearth
2014-01-21 11:14:50 +08:00
@zythum 记错了 外面用了 call this 就是window了
zythum
2014-01-21 11:22:53 +08:00
@yyfearth 不是window也没事。只要这次的this和下次的this一样就可以了。

我发现ruby, func[这里不能有空格](1,2,3)

$99 就500块么。折合一块五一天。还是可以接受的。虽然我也没买...
yyfearth
2014-01-21 11:25:34 +08:00
@zythum 另外就是JS的 this scope 真的很烦,所以用了coffee之后基本上全部都用 => 如果function在 method 内部,在用method的时候全部都 .bind(@)
我用coffee的时候都注意完全不用全局变量,实在需要的用XXX = window.XXX 然后用XXX.xxx,最近用了require.JS 所以window基本上就不用了,需要的话在最后面 return 作为 export
另外我记得 argument.callee 已经不能用了啊
yyfearth
2014-01-21 11:29:22 +08:00
@zythum 这个99刀可以有冤大头公司出就不想自己出啊
coffee 里面 func(a,b) 和 func (a,b) 在语法层上也是不一样的,后者相当于 func((a,b))
func(a,b).chain(...) 写成 func (a,b).chain(...) 就变成bug了
zythum
2014-01-21 11:34:23 +08:00
@yyfearth 你还是活在coffee里面把...

污染window的尽量不要干。 bind我觉得是非常好的处理方式。给程序员足够的自由。不过是ES 5标准的。当然也是个语法糖。就是
function bind(fn, context){ return fn.apply(context, arguments) }

我还是觉得外面写个 var that = this 是很傻的解决方式。
zythum
2014-01-21 11:35:46 +08:00
@yyfearth 不是说了。没习惯么。
zythum
2014-01-21 11:37:23 +08:00
错了。 还要包个func
function bind(fn, context){ return function () { fn.apply(context, arguments) }}

@yyfearth

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

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

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

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

© 2021 V2EX