没搞懂=> 的用法…… 求指点……
我觉得 coffee 语法困惑的地方都可以直接看它翻译出的 js 代码解决啊
->
翻译成(function() {})
=>
翻译成var _this = this; (function() {});
主要解决的问题是因为 js 的函数级作用域。函数内部的 this 会动态的绑定到调用这个函数的对象上
有时候函数嵌套的时候为了保存 this 绑定的上下文,经常会使用
var that = this
确保使用正确的上下文,
或者用call/apply
在调用的时候绑定到正确的对象上,
再或者在 jquery 里面用proxy()
方法,
或者 underscore 里用bindAll
然后 coffeescript 为此提供一个稍微方便一点的手段,直接来一个=>
比如有这段代码
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。
反正我自己写 JavaScript 的时候,不会去改this
的,我都是用self
的,最讨厌那些改this
的库了...所以后来我就用 Python 去了...
楼上先看 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 )