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

chairy11 · 2013年05月09日 · 最后由 Rei 回复于 2013年05月10日 · 4250 次阅读

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

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


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

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

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

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

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

#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。

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

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

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

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

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

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

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

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

师姐你真勤奋啊...

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

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

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

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

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

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

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

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

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

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

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

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

我虽然不是做 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 )

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

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

#31 楼 @Rei 你 qq 多少啊?

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

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