新手问题 coffee 里的 -> 与 => 到底有什么 区别啊?

chairy11 · 发布于 2013年5月09日 · 最后由 Rei 回复于 2013年5月10日 · 2271 次阅读
827

没搞懂=> 的用法…… 求指点……

共收到 35 条回复
90

记得论坛有看到过说明的帖子,, JS 的 this 比较乱, 于是在类里用 => 强制绑定了 _this 先找下帖子


找到: http://ruby-china.org/topics/10578

96

我觉得coffee语法困惑的地方都可以直接看它翻译出的js代码解决啊 ->翻译成(function() {}) =>翻译成var _this = this; (function() {});

主要解决的问题是因为js的函数级作用域。函数内部的this会动态的绑定到调用这个函数的对象上 有时候函数嵌套的时候为了保存this绑定的上下文,经常会使用 var that = this确保使用正确的上下文, 或者用call/apply在调用的时候绑定到正确的对象上, 再或者在jquery里面用proxy()方法, 或者underscore里用bindAll

然后coffeescript为此提供一个稍微方便一点的手段, 直接来一个=>

827

#1楼 @jiyinyiyong #2楼 @krazy 谢谢……不过,貌似你们说的我也不懂……什么域最晕了……好吧好吧,先不管了……

1

#3楼 @chairy11

比如有这段代码

this.bar = 'outer';

$('body').on('click', function() {
  console.log(this.bar); // undefined
})

在 callback 里面用 this.bar 是访问不到外层的 this.bar 的,因为在 callback 中 this 的上下文已经变化了。

解决方法是把 this 存在一个变量中,通过闭包传递进 callback。

this.bar = 'outer';
var _this = this; // 转存到 _this

$('body').on('click', function() {
  console.log(_this.bar); // 通过 _this 调用外层的 this
})

实际中碰到这样的情况会比较多,为了避免重复写 var _this = this,CoffeeScript 就提供了个=>语法来自动生成 _this,=> 里面的 this 调用会编译成 _this。

2575

楼上说的够详细了。附一个官网说明:http://coffeescript.org/#fat-arrow

2973

这个看源代码就知道了,这个前天才坑了我,this把我纠结惨了

374

貌似楼主不知道 Javascript 的 this 坑。

2880

coffee 的文档已经说得够详细了啊...

3753

推荐楼主看看js的域 域门... this是写js必须要知道的常识~

2449

#4楼 @Rei Rei哥说的不错,啥时候写个blog细细的说一说js里面的闭包,绑定,我对这些有一点迷糊

1

#10楼 @Sunnyroger 其实我也挺迷糊的

827

我还没看懂,所以都不好意思回帖了……

96

师姐你真勤奋啊...

827

#13楼 @aisensiy 哪看出我勤奋了?不过,哈哈哈哈,是啊,我就是新一代劳模!

96

#14楼 @chairy11 劳模……给跪了……orz

96

反正我自己写JavaScript的时候,不会去改this的,我都是用self的,最讨厌那些改this的库了...所以后来我就用Python去了...

827

#15楼 @aptx4869 劳动模范嘛……不是很勤奋的么?

96

#17楼 @chairy11 劳模现在某些地方是一个很H的词 /人◕ ‿‿ ◕人\

1

原来楼主不是真正想搞明白这个问题。

827

#19楼 @Rei 我是期望看一眼大家的答案就懂的……结果我发现我看了大家的答案还不懂……然后我就只能等我某天不知不觉中懂了……因为我现在还没有开始写代码……没有很深体验,只是昨天做codeschool的题时遇到了这个问题,后来我看答案把这个level给过了……

827

#19楼 @Rei 你在暨南毕业的?你广东人吗?你现在住哪一块?

1

#22楼 @chairy11 是暨南,广西人。住在北京望京附近。

827

#23楼 @Rei 哦,蛮近的

1

#24楼 @chairy11 很少上q,推特 @chloerei

827

#25楼 @Rei 。。。

96

#20楼 @chairy11 问题在于, JS 的这个语言特性本来就不是很容易说清楚的... 和其他语言的高级语言特性一样, 要给出些许实例才好理解. #4楼 的例子为了说明问题稍微精简了一点, 对于彻底的新人而言理解起来估计还是有压力(吧).

827

#27楼 @5long 恩,我没有深入去学习过JS,就是看了一本JS基础教程和一本jQuery教程,改天还得好好深入研究一下……

90

楼上先看 CoffeeScript 吧, JS 直接学那语法完全受不了.. 话说作用域什么, JS 不是应该比 Ruby 简单的么.. 在 CoffeeScript 就一种匿名函数. JS 还多一种带名字的, Ruby 里不止的吧

96

我虽然不是做js的但我知道这个坑。Web页面是事件驱动的,事件处理的编程就避免不了。js里大量使用function的回调来编写事件处理代码。例如on_click(function() {....。这里就有个问题了。在回调函数里,this到底是指的哪个对象?改一下Rei的例子:

self_obj = this
self_obj.bar = 'outer';
var js_fun = function() {
  console.log(this.bar); // 这个this是指js_fun还是self_obj ?
}
$('body').on('click',js_fun )
1

我觉得还是把 js 的坑踩得差不多了再转 coffee。

一个 js 转 coffee 的工具 http://js2coffee.org/

2449

#31楼 @Rei 你qq多少啊?

1

#32楼 @Sunnyroger 不用抠抠

2449

#31楼 @Rei 那我还是去codecampo吧

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册